我有一些代码使用了专有的sun。*。OperatingSystemMXBean,所以我一直很小心。
try {
_osBean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean();
}
catch (ClassCastException e) {
_osBean = null;
}
但是,当此代码在IBM JVM上运行时,而不是ClassCastException
,我得到一个运行时ClassNotFoundException
。如果该类不可用,为什么这段代码能够编译得很好?JVM如何影响这样的东西呢?
答案 0 :(得分:4)
com.sun。*包是sun为sun JVM(hotspot)编写的私有类,不是公共API(即使你的代码证明它们是可访问的)。
IBM JVM是一个完全不同的实现,并没有它们(因为它们不是任何java / jvm规范的一部分)。
我猜它编译得很好,因为你正在使用sun / oracle JDK编译
尝试解决问题,尝试转换为
java.lang.management.OperatingSystemMXBean
代替(这是一个公共API)并查看它是否适合您
答案 1 :(得分:1)
您正在使用Sun Javac进行编译
com.sun.management.OperatingSystemMXBean
with,但IBM Java与之一起运行。您的IBM环境不会包含与Sun相关的任何内容。 com.sun。*类是专有的,应谨慎使用。
顺便说一句,您只需通过针对第三方jar进行编译即可获得此错误,但不能使用它进行部署。例如一个Apache jar或类似的。这不是特别与专有罐有关的错误,而是与一般的部署问题有关。
答案 2 :(得分:0)
据推测,您正在针对包含com.sun.management.OperatingSystemMXBean
的Sun JDK 编译。这不是标准JDK的一部分,这就是为什么你不应该使用它 - 它不能保证出现在其他Java系统上,并且不出现在你正在使用的IBM JVM中
与在执行时不存在的任何其他库进行编译相同。
另见:
答案 3 :(得分:0)
您正在使用Sun提供的编译器和JDK(具有该类),但是在没有的IBM JVM上运行。通常,如果它以com.sun开头。*是特定于sun的,如果您不能保证JVM将运行它,则不应该依赖它。
答案 4 :(得分:0)
应用程序服务器操作可能是此错误的原因。 例如,在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的方法。