1

プロプライエタリのsun。*。OperatingSystemMXBeanを使用するコードがあるので、注意していました。

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

ただし、このコードをIBM JVMで実行すると、ではなくClassCastException、ランタイムが取得されますClassNotFoundException。そのクラスが利用できない場合、なぜこのコードはうまくコンパイルできるのですか?また、JVMはこのようなものにどのように影響しますか?

4

5 に答える 5

4

com.sun。*パッケージは、sun JVM(ホットスポット)用にsunによって記述されたプライベートクラスであり、パブリックAPIではありません(コードでアクセス可能であることが証明されている場合でも)。IBM JVMは完全に異なる実装であり、それらはありません(java / jvm仕様の一部ではないため)。 問題を解決するために
sun/oracle JDKでコンパイルしているので、正常にコンパイルされると思います。

java.lang.management.OperatingSystemMXBean

代わりに(これはパブリックAPIです)、それがあなたのために働くかどうかを確認してください

于 2013-01-04T17:33:41.100 に答える
1

コンパイルにSunJavacを使用しています

com.sun.management.OperatingSystemMXBean

を使用しますが、実行するIBMJavaを使用します。IBM環境には、Sunに関連するものは何もありません。com.sun。*クラスは独自仕様であるため、注意して使用する必要があります。

余談ですが、サードパーティのjarに対してコンパイルするだけでこのエラーが発生する可能性がありますが、それを使用してデプロイすることはできません。たとえば、Apachejarなど。これは、特にプロプライエタリ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

おそらく、を含むSunJDKに対してコンパイルcom.sun.management.OperatingSystemMXBeanしているのでしょう。これは標準のJDKの一部ではないため、使用しないでください。他のJavaシステムに存在することが保証されておらず、使用しているIBMJVMに存在しないように見えます。

これは、実行時に存在しない他のライブラリに対してコンパイルするのと同じです。

参照:

于 2013-01-04T17:34:36.240 に答える
0

Sunが提供するコンパイラとJDK(クラスがあります)を使用していますが、そうでないIBMJVMで実行しています。一般に、com.sun。*で始まる場合はSun固有であり、どのJVMで実行されるかを保証できない場合は信頼しないでください。

于 2013-01-04T17:36:10.940 に答える