【问题标题】:WildFly can't see OperatingSystemMXBean?WildFly 看不到 OperatingSystemMXBean?
【发布时间】:2017-05-02 11:39:45
【问题描述】:

我有这个代码来读取物理内存:

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,因此它应该像控制台应用程序一样看到这个类。
那个类在jdk1.8.0_121\jre\lib\rt.jar 所以我不明白为什么WildFly 抱怨那个ClassNotFoundException。

有什么问题? 如何让 WildFly 运行该代码?

【问题讨论】:

    标签: java wildfly wildfly-10


    【解决方案1】:

    这可以通过在 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>
    

    【讨论】:

    • 这个答案解决了我对 Windows 操作系统的疑问。需要在 AIX 上验证
    【解决方案2】:

    这是因为这些包被 jboss-modules 过滤掉了,如果你查看“modules/system/layers/base/sun/jdk/main/module.xml”,你会发现 com.sun.management 不存在。 您需要创建一个模块来获取这些类或编辑此模块。

    【讨论】:

    • 那么,WildFly 故意从 JDK 中排除了一些类?好奇为什么。 JBoss5 和 JBoss6 对这些类没有问题。
    • @Chupacabras com.sun.* 包是 Sun/Oracle 为 Sun JVM 编写的私有类,不属于 Java/JVM 规范。
    • @RüdigerHerrmann,虽然您应该谨慎对待 com.sun.* 包,但 com.sun.management 被标记为 @Exported 包(在 Java 8 中),这意味着 " 包是已导出适合在 JDK 实现本身之外使用的部分 JDK”(请参阅 docs.oracle.com/javase/8/docs/jre/api/management/extension/com/…)。在 Java 11/12 中,该包是 jdk.management 模块(同样是公共 API)的一部分。所以,jboss-modules 在这里过于严格了。
    【解决方案3】:

    我不得不替换我原来的代码,这是新的:

    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);
    

    【讨论】:

      猜你喜欢
      • 2016-08-22
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2019-06-16
      相关资源
      最近更新 更多