为什么这段代码会编译,但运行时ClassNotFoundException?

时间:2013-01-04 17:32:06

标签: 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上运行时,而不是ClassCastException,我得到一个运行时ClassNotFoundException。如果该类不可用,为什么这段代码能够编译得很好?JVM如何影响这样的东西呢?

5 个答案:

答案 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的方法。