1

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

try {
    _osBean = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean();
}
catch (ClassCastException e) {
    _osBean = null;
}

但是,当此代码在 IBM JVM 上ClassCastException运行时,我得到的是 runtime而不是ClassNotFoundException. 如果该类不可用,为什么这段代码能够编译得很好,JVM如何影响这样的事情?

4

5 回答 5

4

com.sun.* 包是 sun 为 sun JVM(热点)编写的私有类,不是公共 API(即使您的代码证明它们是可访问的)。IBM JVM 是一个完全不同的实现并且没有它们(因为它们不是任何 java/jvm 规范的一部分)。
我猜它编译得很好,因为您正在使用 sun/oracle JDK 进行编译
以尝试解决问题,请尝试转换为

java.lang.management.OperatingSystemMXBean

而是(这是一个公共 API),看看它是否适合你

于 2013-01-04T17:33:41.100 回答
1

您正在使用 Sun Javac 进行编译

com.sun.management.OperatingSystemMXBean

与,但与 IBM Java 一起运行。您的 IBM 环境不会有任何与 Sun 相关的内容。com.sun.* 类是专有的,应谨慎使用。

顺便说一句,您只需针对 3rd-party jar 进行编译,而不是使用它进行部署,就可以得到这个错误。例如 Apache jar 或类似的。这不是特别与专有 jar 相关的错误,而是与一般部署问题相关的错误。

于 2013-01-04T17:33:59.650 回答
1

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

于 2017-05-24T10:23:54.047 回答
0

大概您正在针对包含com.sun.management.OperatingSystemMXBean. 这不是标准 JDK 的一部分,这就是您不应该使用它的原因 - 它不能保证存在于其他 Java 系统上,并且似乎存在于您正在使用的 IBM JVM 中。

这与针对执行时不存在的任何其他库进行编译相同。

也可以看看:

于 2013-01-04T17:34:36.240 回答
0

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

于 2013-01-04T17:36:10.940 回答