Почему этот код компилируется, но со временем выполнения ClassNotFoundException?

У меня есть некоторый код, который использует проприетарный sun.*.OperatingSystemMXBean, поэтому я был осторожен с ним.

try {
    _osBean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean();
}
catch (ClassCastException e) {
    _osBean = null;
}

Однако, когда этот код выполняется на IBM JVM, вместо ClassCastExceptionЯ получаю время выполнения ClassNotFoundException, Почему этот код может прекрасно скомпилироваться, если этот класс недоступен и как JVM влияет на что-то подобное?

5 ответов

Решение

Пакеты com.sun.* являются частными классами, написанными sun для Sun JVM (точка доступа) и не являются публичным API (даже если ваш код доказывает, что они доступны). IBM JVM является совершенно другой реализацией и не имеет их (так как они не являются частью какой-либо спецификации java/jvm).
я предполагаю, что он компилируется нормально, так как вы компилируете с JDK Sun / Oracle
чтобы попытаться решить проблему, попробуйте

java.lang.management.OperatingSystemMXBean

вместо этого (который является публичным API) и посмотрите, работает ли он для вас

Вы используете Sun Javac для компиляции

com.sun.management.OperatingSystemMXBean

с, но IBM Java для запуска. Ваша среда IBM не будет иметь ничего общего с Sun. Классы com.sun.* Являются проприетарными и должны использоваться с осторожностью.

Кроме того, вы можете получить эту ошибку, просто скомпилировав против стороннего JAR, но не развертывая с ним. например, кувшин Apache или аналогичный. Это не ошибка, связанная, в частности, с проприетарными банками, а скорее с вопросами развертывания в целом.

Причиной этой ошибки может быть работа сервера приложений. Например, в точке доступа wildfly10 системные классы, такие как com.sun.management, не могут быть загружены автоматически, и вы должны определить их для загрузки AP. определение может быть сделано через \ modules \ system \ layer \base\sun\jdk\main\module.xml

<dependencies>
    <module name="sun.scripting" export="true"/>
    <system export="true">
        <paths>
        <path name="com/sun/management"/>
        </path>
        <exports>
            <include-set>
                <path name="META-INF/services"/>
            </include-set>
        </exports>
    </system>
</dependencies>

добавив вышеприведенное определение в упомянутый файл, wildfly10 может загрузить класс, и вы можете использовать методы com.sun.management.OperatingSystemMXBean во время выполнения.

Предположительно, вы компилируете против Sun JDK, которая содержит com.sun.management.OperatingSystemMXBean, Это не является частью стандартного JDK, поэтому его не следует использовать - он не гарантированно присутствует в других системах Java и, по-видимому, не присутствует в используемой IBM JVM.

Это то же самое, что компиляция с любой другой библиотекой, которой нет во время выполнения.

Смотрите также:

Вы используете предоставленный Sun компилятор и JDK (у которого есть класс), но работаете на IBM JVM, которая этого не делает. Как правило, если он начинается с com.sun. *, Это зависит от солнца, и на него не следует полагаться, если вы не можете гарантировать, что JVM будет его запускать.

Другие вопросы по тегам