WildFly 看不到 OperatingSystemMXBean?
WildFly can't see OperatingSystemMXBean?
我有这个读取物理内存的代码:
com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
long physicalMemorySize =os.getTotalPhysicalMemorySize();
System.out.println("physicalMemorySize="+physicalMemorySize);
我有 JDK 1.8.0_121(64 位,在 Windows 上)
这段代码编译没有问题,我可以在控制台应用程序中 运行 它,它 运行 没问题。
但是当我将此代码放入 WildFly 10 服务器上的某些 Bean 或 JSP 页面时,它显示错误:
Caused by: java.lang.ClassNotFoundException: com.sun.management.OperatingSystemMXBean
WildFly 使用完全相同的 JDK,所以它应该看到这个 class 就像控制台应用程序看到它一样。
class 在 jdk1.8.0_121\jre\lib\rt.jar
中,所以我不明白为什么 WildFly 会抱怨 ClassNotFoundException。
有什么问题吗?
如何制作 WildFly 运行 那个代码?
那是因为那些包被 jboss-modules 过滤掉了,如果你查看 "modules/system/layers/base/sun/jdk/main/module.xml" 你会发现 com.sun.management 不存在。
您需要创建一个模块来获取这些 类 或编辑此模块。
我必须替换原来的代码,这是新代码:
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
Object attribute =mBeanServer.getAttribute(new ObjectName("java.lang", "type", "OperatingSystem"), "TotalPhysicalMemorySize");
long physicalMemorySize = Long.parseLong(attribute.toString());
System.out.println("physicalMemorySize="+physicalMemorySize);
这可以通过在您的 jboss-deployment-structure.xml
:
中使用类似这样的内容明确包含 com.sun.management
类 来解决
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<dependencies>
<system>
<paths>
<path name="com/sun/management"/>
</paths>
</system>
</dependencies>
</deployment>
</jboss-deployment-structure>
我有这个读取物理内存的代码:
com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
long physicalMemorySize =os.getTotalPhysicalMemorySize();
System.out.println("physicalMemorySize="+physicalMemorySize);
我有 JDK 1.8.0_121(64 位,在 Windows 上)
这段代码编译没有问题,我可以在控制台应用程序中 运行 它,它 运行 没问题。
但是当我将此代码放入 WildFly 10 服务器上的某些 Bean 或 JSP 页面时,它显示错误:
Caused by: java.lang.ClassNotFoundException: com.sun.management.OperatingSystemMXBean
WildFly 使用完全相同的 JDK,所以它应该看到这个 class 就像控制台应用程序看到它一样。
class 在 jdk1.8.0_121\jre\lib\rt.jar
中,所以我不明白为什么 WildFly 会抱怨 ClassNotFoundException。
有什么问题吗? 如何制作 WildFly 运行 那个代码?
那是因为那些包被 jboss-modules 过滤掉了,如果你查看 "modules/system/layers/base/sun/jdk/main/module.xml" 你会发现 com.sun.management 不存在。 您需要创建一个模块来获取这些 类 或编辑此模块。
我必须替换原来的代码,这是新代码:
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
Object attribute =mBeanServer.getAttribute(new ObjectName("java.lang", "type", "OperatingSystem"), "TotalPhysicalMemorySize");
long physicalMemorySize = Long.parseLong(attribute.toString());
System.out.println("physicalMemorySize="+physicalMemorySize);
这可以通过在您的 jboss-deployment-structure.xml
:
com.sun.management
类 来解决
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<dependencies>
<system>
<paths>
<path name="com/sun/management"/>
</paths>
</system>
</dependencies>
</deployment>
</jboss-deployment-structure>