如何获取 Java class' 真正的模块依赖?
How to get Java class' real module dependency?
我的 JDK 版本是 OpenJDK 11。
我的 class 文件是 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 windows 中有 运行 我的代码。它工作正常。
然后我运行我的jre中的代码。代码不能 运行,我得到一个错误:
javax.management.AttributeNotFoundException: No such attribute: TotalPhysicalMemorySize
所以我认为原因是缺少一些依赖模块。我运行jlink
生成一个完整的模块jre。当我使用整个模块 jre 时,代码 运行s 再次正确。
如何获取真正的依赖模块?或者这是 JDK 的错误?
在 JDK9 之前,类型 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
的依赖关系。
我的 JDK 版本是 OpenJDK 11。 我的 class 文件是 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 windows 中有 运行 我的代码。它工作正常。
然后我运行我的jre中的代码。代码不能 运行,我得到一个错误:
javax.management.AttributeNotFoundException: No such attribute: TotalPhysicalMemorySize
所以我认为原因是缺少一些依赖模块。我运行jlink
生成一个完整的模块jre。当我使用整个模块 jre 时,代码 运行s 再次正确。
如何获取真正的依赖模块?或者这是 JDK 的错误?
在 JDK9 之前,类型 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
的依赖关系。