使用自定义日志格式器时,Wildfly环境下出现了java.lang.NoClassDefFoundError: org/jboss/modules/ModuleLoader错误。

9

我正在使用Wildfly10中默认的jboss-logging(LogManager),并尝试创建自己的日志格式。

我在standalone.xml中进行以下配置:

    <subsystem xmlns="urn:jboss:domain:logging:3.0">
        <use-deployment-logging-config value="false"/>
        <console-handler name="CONSOLE">
            <level name="INFO"/>
            <formatter>
                <named-formatter name="JSON_PATTERN"/>
            </formatter>
        </console-handler>
        <formatter name="JSON_PATTERN">
            <custom-formatter
                    class="com.mycompany.JsonLogFormatter"
                    module="com.mycompany.logging"/>
        </formatter>
    </subsystem>

我创建了一个类似于以下的jboss模块:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="com.mycompany.logging">
    <resources>
        <resource-root path="log-utils-1.0.0.jar" />
    </resources>
    <dependencies>
        <module name="javax.json.api"/>
        <module name="org.jboss.logmanager" />
        <module name="org.jboss.logging" />
        <module name="org.jboss.modules"/>
    </dependencies>
</module>

log-utils-1.0.0.jar包含我的JsonLogFormatter类,并位于$JBOSS_HOME/modules/com/mycompany/logging/main目录中的module.xml相同的目录中。

启动wildfly容器时,它无法启动并出现以下异常:

java.lang.IllegalArgumentException: Failed to load module "com.mycompany.logging" for formatter "JSON_PATTERN"
    at org.jboss.logmanager.config.AbstractPropertyConfiguration.<init>(AbstractPropertyConfiguration.java:64) [jboss-logmanager-2.0.4.Final.jar:2.0.4.Final]
    at org.jboss.logmanager.config.FormatterConfigurationImpl.<init>(FormatterConfigurationImpl.java:30) [jboss-logmanager-2.0.4.Final.jar:2.0.4.Final]
    at org.jboss.logmanager.config.LogContextConfigurationImpl.addFormatterConfiguration(LogContextConfigurationImpl.java:171) [jboss-logmanager-2.0.4.Final.jar:2.0.4.Final]
    at org.jboss.as.logging.logmanager.ConfigurationPersistence.addFormatterConfiguration(ConfigurationPersistence.java:218)
    at org.jboss.as.logging.CustomFormatterResourceDefinition$2.performRuntime(CustomFormatterResourceDefinition.java:117)
    at org.jboss.as.logging.LoggingOperations$LoggingAddOperationStepHandler$1.execute(LoggingOperations.java:204)
    at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:890) [wildfly-controller-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.controller.AbstractOperationContext.processStages(AbstractOperationContext.java:659) [wildfly-controller-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:370) [wildfly-controller-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.controller.OperationContextImpl.executeOperation(OperationContextImpl.java:1329) [wildfly-controller-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.controller.ModelControllerImpl.boot(ModelControllerImpl.java:493) [wildfly-controller-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.controller.AbstractControllerService.boot(AbstractControllerService.java:387) [wildfly-controller-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.controller.AbstractControllerService.boot(AbstractControllerService.java:349) [wildfly-controller-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.server.ServerService.boot(ServerService.java:397) [wildfly-server-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.server.ServerService.boot(ServerService.java:366) [wildfly-server-2.2.0.Final.jar:2.2.0.Final]
    at org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:299) [wildfly-controller-2.2.0.Final.jar:2.2.0.Final]
    at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_151]
 Caused by: java.lang.NoClassDefFoundError: org/jboss/modules/ModuleLoader
    at org.jboss.logmanager.config.AbstractPropertyConfiguration$ModuleFinder.getClassLoader(AbstractPropertyConfiguration.java:463) [jboss-logmanager-2.0.4.Final.jar:2.0.4.Final]
    at org.jboss.logmanager.config.AbstractPropertyConfiguration.<init>(AbstractPropertyConfiguration.java:62) [jboss-logmanager-2.0.4.Final.jar:2.0.4.Final]
    ... 16 more

1
这对我来说看起来都是正确的。你甚至不需要在你的模块中依赖于 org.jboss.loggingorg.jboss.modules 模块。 - James R. Perkins
@JamesR.Perkins 谢谢,我已经整理好了。 - Jason White
1
我能想到的唯一原因是您需要将jboss模块JAR添加到引导类路径中,这是因为您还在那里添加了日志管理器JAR。总的来说,不建议这样做。 - David M. Lloyd
1
除非您正在尝试使用记录日志或类似功能的代理,否则您不需要这样做。那是你在做什么吗? - David M. Lloyd
1
啊,我明白了。是的,代理是一个我们还没有更好解决方案的棘手问题。但我希望至少在Java 9+中很快能有一个解决方案。 - David M. Lloyd
显示剩余7条评论
1个回答

10

当我在JAVA_OPTS环境中添加了以下参数后,我能够获得一个干净的启动,没有异常:

JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:$JBOSS_HOME/jboss-modules.jar"

我从这个页面得到了灵感:https://inspectit-performance.atlassian.net/wiki/spaces/DOC17/pages/54657166/JBoss+6.x

更新的信息:

我的完整JAVA_OPTS设置如下:

-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m 
-Djava.net.preferIPv4Stack=true 
-Djava.awt.headless=true 
-Djboss.https.port=8443 
-Djboss.http.port=8080 
-Djboss.bind.address=0.0.0.0 
-Djboss.server.log.dir=/home/app/logs 
-agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n 
-DconfigurationLocationStrategy=filesystem 
-Djava.util.logging.manager=org.jboss.logmanager.LogManager 
-Djboss.modules.system.pkgs=org.jboss.byteman,org.jboss.logmanager 
-Xbootclasspath/p:/home/app/wildfly/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.0.4.Final.jar 
-Xbootclasspath/p:/home/app/wildfly/jboss-modules.jar 
-javaagent:/opt/prometheus/jmx_prometheus_java_agent.jar=31500:/opt/prometheus/prometheus.yaml

看起来需要设置logmanager属性的原因是我在容器中部署了一个prometheus代理。

如果我不部署prometheus代理,则不需要将任何logmanager参数添加到JAVA_OPTS中。不幸的是,不部署这个代理不是一个选项。


2
虽然它现在可能有效,但看起来并不是正确的解决方案。 - Philippe Marschall
是的,这感觉像是一个hack,所以我非常愿意听取更好的解决方案。 - Jason White
1
对我来说看起来是正确的,应该能够运行。我们有类似的东西,而且它在我们这里能够正常工作。我们不依赖于“org.jboss.logging”和“org.jboss.modules”,而是添加了一个依赖项到“javax.xml.stream.api”。 - Philippe Marschall
@PhilippeMarschall 谢谢,我已经在 module.xml 中删除了对 org.jboss.logging 和 org.jboss.modules 的依赖,但是我仍然需要添加上面提到的 -Xbootclasspath 选项才能使其正常工作。 - Jason White
1
只有在添加了"JAVA_OPTS="$JAVA_OPTS -Dmodule.path=$JBOSS_HOME/modules""之后,这对我才有效。 - Marcus Linke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接