どのようにJavaのクラスの実際のモジュールの依存関係を取得しますか?

S.Lee:

私のJDKのバージョンは、OpenJDKの11私のクラスファイルがあるjmx.Main.class

ここに私のコードです。

package jmx;
import java.lang.management.ManagementFactory;

import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;

public class Main {
    public static void main(String[] args) throws InstanceNotFoundException, AttributeNotFoundException, MalformedObjectNameException, ReflectionException, MBeanException  {
        /* Total number of processors or cores available to the JVM */
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize");
        Object attribute2 = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "FreePhysicalMemorySize");
        System.out.println("Total memory: "+ Long.parseLong(attribute.toString()) / 1024  +"MB");
        System.out.println("Free  memory: "+ Long.parseLong(attribute2.toString()) / 1024  +"MB");
    }
}

それはIDEで実行するとき、それは正常に動作します。私は、カスタムJREを使用します。そして、私が使用しjdeps、依存関係を分析します。結果は次のとおりです。

Main.class -> java.base
Main.class -> java.management
   jmx                                        -> java.io                                            java.base
   jmx                                        -> java.lang                                          java.base
   jmx                                        -> java.lang.invoke                                   java.base
   jmx                                        -> java.lang.management                               java.management
   jmx                                        -> javax.management                                   java.management

だから私は思うjava.baseし、java.management依存モジュールです。

そして、私が使用jlink私のカスタムJREを生成します。

jlink --module-path "C:\Program Files\Java\jdk-11.0.6\jmods" --add-modules java.base,java.management --output jre11

私のカスタムJREを使用する前に、私はCMDウィンドウに自分のコードを実行していました。それは正常に動作します。

それから私は私のJREのコードを実行します。コードを実行することはできませんし、私はエラーを得ました:

javax.management.AttributeNotFoundException: No such attribute: TotalPhysicalMemorySize

だから私は、その理由は、いくつかの依存モジュールが不足しているということだと思います。私は、実行jlinkモジュール全体のJREを生成します。私は、モジュール全体のJREを使用すると、コードが再び正常に動作します。

どのように私は本当の依存モジュールを得ることができますか?またはそれは、JDKのバグですか?

ホルガー:

JDK 9の前に、種類はcom.sun.management.OperatingSystemMXBeanの文書化されていない拡張しましたjava.lang.management.OperatingSystemMXBeanだから、同じように反射属性クエリを使用するのが妥当だったgetAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize")非標準APIへの依存関係を作成しないし。

長所も欠点です。何の依存関係が存在しない場合には、依存関係を分析するためのツールは、依存関係を検出することはできません。

あなたはモジュールを追加するとjdk.management、拡張子が利用できるようになります。文書化されたモジュールの一部であることはまた、あなたがモジュールに恒久的な依存関係を受け入れることを望んでいるとき、あなたは拡張に使用できることを意味しOperatingSystemMXBean、直接。

import com.sun.management.OperatingSystemMXBean;
import java.lang.management.ManagementFactory;

public class OSMX {
    public static void main(String[] args) {
        OperatingSystemMXBean osBean
            = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
        System.out.println("Total memory: "
            + osBean.getTotalPhysicalMemorySize() / (1024*1024)  +"MB");
        System.out.println("Free  memory: "
            + osBean.getFreePhysicalMemorySize() / (1024*1024)  +"MB");
    }
}

その後、jdepsに依存関係を報告しますjdk.management正しく。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=13393&siteId=1