Почему этот код компилируется, но со временем выполнения 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 будет его запускать.