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>