在JBoss EAP 7.1上配置DX APM失败,抛出java.lang.ClassNotFoundException
JBoss EAP 7.1.6集成DX APM启动失败:NoClassDefFoundError: org/jboss/logmanager/Level
问题场景
在Red Hat Enterprise Linux 8.9上配置JBoss EAP 7.1.6.GA集成DX APM时,启动服务器抛出类找不到异常,启动脚本的JAVA_OPTS配置如下:
JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true" JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager" JAVA_OPTS="$JAVA_OPTS -javaagent:/apps/apm/wily/Agent.jar" JAVA_OPTS="$JAVA_OPTS -Dcom.wily.introscope.agentProfile=/apps/apm/wily/releases/24.3/core/config/IntroscopeAgent.profile" JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:${JBOSS_HOME}/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.0.7.Final-redhat-1.jar"
抛出的异常堆栈:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/logmanager/Level at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.jboss.modules.Module.run(Module.java:329) at org.jboss.modules.Main.main(Main.java:525) Caused by: java.lang.ClassNotFoundException: org.jboss.logmanager.Level at java.net.URLClassLoader.findClass(URLClassLoader.java:387) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at org.jboss.modules.JDKSpecific.getSystemClass(JDKSpecific.java:183) at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:397) at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:116)
问题原因
- 手动添加的
-Xbootclasspath/p破坏了JBoss EAP原有模块类加载逻辑,仅指定jboss-logmanager主jar但未包含其依赖组件,导致类加载不完整。 - DX APM Agent的加载顺序晚于LogManager配置,Agent类加载器干扰了LogManager的初始化流程。
JBOSS_MODULES_SYSTEM_PKGS可能未包含org.jboss.logmanager,导致系统类加载器无法正确识别该包。
解决方案
1. 移除手动指定的Xbootclasspath配置
JBoss EAP 7.x通过模块系统自动管理logmanager的加载,手动指定bootclasspath会引发类加载冲突,直接删除该行:
# 删除以下配置行 # JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:${JBOSS_HOME}/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.0.7.Final-redhat-1.jar"
2. 调整Agent加载顺序
将DX APM Agent的配置移到-Djava.util.logging.manager之前,确保Agent初始化不影响LogManager的加载:
# 先加载Agent,再配置LogManager JAVA_OPTS="$JAVA_OPTS -javaagent:/apps/apm/wily/Agent.jar" JAVA_OPTS="$JAVA_OPTS -Dcom.wily.introscope.agentProfile=/apps/apm/wily/releases/24.3/core/config/IntroscopeAgent.profile" JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
3. 确保系统包包含LogManager
检查并更新JBOSS_MODULES_SYSTEM_PKGS,将org.jboss.logmanager加入系统包列表:
JBOSS_MODULES_SYSTEM_PKGS="org.jboss.logmanager,${JBOSS_MODULES_SYSTEM_PKGS}" JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"
4. 完整配置示例
调整后的启动脚本JAVA_OPTS配置:
JBOSS_MODULES_SYSTEM_PKGS="org.jboss.logmanager,${JBOSS_MODULES_SYSTEM_PKGS}" JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true" JAVA_OPTS="$JAVA_OPTS -javaagent:/apps/apm/wily/Agent.jar" JAVA_OPTS="$JAVA_OPTS -Dcom.wily.introscope.agentProfile=/apps/apm/wily/releases/24.3/core/config/IntroscopeAgent.profile" JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
5. 清理缓存后重启
删除JBOSS_HOME下的临时缓存目录,避免旧类加载信息干扰:
rm -rf ${JBOSS_HOME}/tmp/* rm -rf ${JBOSS_HOME}/data/*
执行启动脚本重新启动JBoss EAP。
内容的提问来源于stack exchange,提问作者fanatik
相关产品推荐
相关产品推荐

