如何获取Java类真正的模块依赖?



我的JDK版本是OpenJDK 11。我的类File是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.basejava.management是依赖模块。

然后我使用jlink生成我的自定义jre。

jlink --module-path "C:Program FilesJavajdk-11.0.6jmods" --add-modules java.base,java.management --output jre11

在使用我的自定义jre之前,我已经在cmd窗口中运行了我的代码。它运行良好。

然后我在jre中运行代码。代码无法运行,我得到了一个错误:

javax.management.AttributeNotFoundException: No such attribute: TotalPhysicalMemorySize

所以我认为原因是缺少了一些依赖模块。我运行jlink来生成一个完整的模块jre。当我使用整个模块jre时,代码再次正确运行。

如何获取真正的依赖模块?还是JDK的bug?

在JDK9之前,类型com.sun.management.OperatingSystemMXBeanjava.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报告依赖关系。

相关内容

  • 没有找到相关文章

最新更新