Java 为什么这段代码要编译,但要使用运行时ClassNotFoundException?
我有一些使用专有sun.*.OperatingSystemMXBean的代码,所以我对它很小心Java 为什么这段代码要编译,但要使用运行时ClassNotFoundException?,java,jvm,classnotfoundexception,ibm-jvm,Java,Jvm,Classnotfoundexception,Ibm Jvm,我有一些使用专有sun.*.OperatingSystemMXBean的代码,所以我对它很小心 try { _osBean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean(); } catch (ClassCastException e) { _osBean = null; } 但是,当这段代码在IBM JVM
try {
_osBean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean();
}
catch (ClassCastException e) {
_osBean = null;
}
但是,当这段代码在IBM JVM上运行时,我得到的不是运行时的
ClassCastException
,而是运行时的ClassNotFoundException
。如果这个类不可用,为什么这个代码可以编译得很好?JVM是如何影响这样的事情的?com.sun.*包是sun为sun JVM(热点)编写的私有类,不是公共API(即使您的代码证明它们是可访问的)。
IBM JVM是一个完全不同的实现,没有它们(因为它们不是任何java/JVM规范的一部分)。由于您使用sun/oracle JDK进行编译,我猜它可以很好地编译
要尝试解决此问题,请尝试
java.lang.management.OperatingSystemMXBean
取而代之的是(这是一个公共API),看看这是否适用于com.sun.*包是sun为sun JVM(热点)编写的私有类,不是公共API(即使您的代码证明它们是可访问的)。 IBM JVM是一个完全不同的实现,没有它们(因为它们不是任何java/JVM规范的一部分)。
由于您使用sun/oracle JDK进行编译,我猜它可以很好地编译
要尝试解决此问题,请尝试
java.lang.management.OperatingSystemMXBean
取而代之的是(这是一个公共API),看看这是否适用于您您正在使用Sun Java C进行编译
com.sun.management.OperatingSystemMXBean
使用,但要使用IBM Java运行。您的IBM环境将不会有任何与Sun相关的内容。com.sun.*类是专有的,应谨慎使用
另一方面,您只需针对第三方jar进行编译,而不是部署,就可以得到这个错误。e、 g.ApacheJAR或类似产品。这不是一个特别与专有JAR相关的错误,而是一般的部署问题。您使用的是Sun Javac来编译
com.sun.management.OperatingSystemMXBean
使用,但要使用IBM Java运行。您的IBM环境将不会有任何与Sun相关的内容。com.sun.*类是专有的,应谨慎使用
另一方面,您只需针对第三方jar进行编译,而不是部署,就可以得到这个错误。e、 g.ApacheJAR或类似产品。这不是一个特别与专有JAR相关的错误,而是一个总体部署问题。可能您是针对Sun JDK进行编译的,它包含com.Sun.management.OperatingSystemMXBean
。这不是标准JDK的一部分,这就是为什么不应该使用它的原因——它不能保证出现在其他Java系统上,而且在您使用的IBM JVM中似乎也不存在
这与针对执行时不存在的任何其他库进行编译是一样的
另见:
com.Sun.management.OperatingSystemMXBean
。这不是标准JDK的一部分,这就是为什么不应该使用它的原因——它不能保证出现在其他Java系统上,而且在您使用的IBM JVM中似乎也不存在
这与针对执行时不存在的任何其他库进行编译是一样的
另见:
<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的方法。应用程序服务器操作可能是此错误的原因。 例如,在wildfly10 AP中,无法自动加载com.sun.management等系统类,您必须定义它才能加载AP。 可以通过\modules\system\layers\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的方法。如果您使用oracle编译器编译它并在IBM JVM上运行它,我想可能会发生这种情况。永远不要使用任何
com.sun.
类。@fge-strong单词。我更愿意说,您必须小心,了解您的部署环境,并在任何时候都优雅地后退possible@fge-不幸的是,有时你别无选择。我不认为这里是这种情况,尽管我认为如果您使用oracle编译器编译它并在IBM JVM上运行它,可能会发生这种情况。永远不要使用任何com.sun.
类。@fge-strong单词。我更愿意说,您必须小心,了解您的部署环境,并在任何时候都优雅地后退possible@fge-不幸的是,有时你别无选择。我不认为这里是这样,尽管java.lang变体当然可以正常工作。我从中得到的是,Java不包括编译后的jar中的所有类,这些类留给JVM动态加载?我从来没有这样想过。这似乎很奇怪,因为像C这样的语言会为s生成机器代码