Java 为什么这段代码要编译,但要使用运行时ClassNotFoundException?

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

我有一些使用专有sun.*.OperatingSystemMXBean的代码,所以我对它很小心

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中似乎也不存在

这与针对执行时不存在的任何其他库进行编译是一样的

另见:

您可能是针对Sun JDK进行编译,该JDK包含
com.Sun.management.OperatingSystemMXBean
。这不是标准JDK的一部分,这就是为什么不应该使用它的原因——它不能保证出现在其他Java系统上,而且在您使用的IBM JVM中似乎也不存在

这与针对执行时不存在的任何其他库进行编译是一样的

另见:


您使用的是Sun提供的编译器和JDK(它有类),但运行在IBM JVM上,而IBM JVM没有。通常,如果它以com.sun.*开头,那么它是特定于sun的,如果您不能保证运行它的JVM是什么,那么就不应该依赖它。

您使用的是sun提供的编译器和JDK(具有该类),但运行在IBM JVM上的不是。通常,如果它以com.sun.*开头,则它是特定于sun的,如果您不能保证JVM将运行它,则不应依赖它。

应用程序服务器操作可能是此错误的原因。 例如,在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的方法。

应用程序服务器操作可能是此错误的原因。 例如,在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生成机器代码