在Payara 6中使用Logback 1.4.14出现ClassNotFoundException求助
解决Payara 6.2024.1 + Logback 1.4.14 管理GUI无法访问的问题
问题原因
Payara 6基于Jakarta EE 9+,所有Servlet相关API从javax.servlet迁移到jakarta.servlet命名空间。将Logback的jar包放在lib/ext目录会导致系统类加载器优先加载这些jar,若Logback间接依赖旧的javax.servlet类,会覆盖容器自身的jakarta.servlet类,最终引发ClassNotFoundException: jakarta.servlet.ServletContainerInitializer,导致管理GUI无法启动。而Payara 5基于Java EE 8,使用javax.servlet命名空间,因此不会出现此冲突。
解决方案
1. 调整Logback jar的存放位置
将logback-core-1.4.14.jar和logback-classic-1.4.14.jar从${payaraRoot}\glassfish\domains\TEST\lib\ext移动到${payaraRoot}\glassfish\domains\TEST\lib目录。
lib目录下的jar由Payara的应用类加载器加载,不会干扰容器核心类的加载顺序,避免命名空间冲突。
2. 添加适配的SLF4J桥接器
Logback 1.4.x对应SLF4J 2.x版本,需要添加jul-to-slf4j-2.0.x.jar(版本需与Logback兼容,建议用2.0.9或匹配版本)到${payaraRoot}\glassfish\domains\TEST\lib目录。
org.slf4j.bridge.SLF4JBridgeHandler属于该jar包,确保桥接器能正常工作,同时避免类缺失问题。
3. 修正logging.properties配置
编辑${payaraRoot}\glassfish\domains\TEST\config\logging.properties,确保配置正确:
# 保留SLF4J桥接器作为handler handlers=org.slf4j.bridge.SLF4JBridgeHandler # 关闭默认的JUL handlers(可选,避免重复日志) # handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler # 设置桥接器日志级别 org.slf4j.bridge.SLF4JBridgeHandler.level=INFO # 禁用JUL的默认日志处理,避免重复输出 java.util.logging.ConsoleHandler.level=OFF java.util.logging.FileHandler.level=OFF
4. 验证配置并重启域
- 确保
logback.xml仍放在${payaraRoot}\glassfish\domains\TEST\config目录(该配置会被Logback自动识别)。 - 执行命令
asadmin restart-domain TEST重启域,之后访问localhost:4848即可正常打开管理GUI,同时Logback的日志配置也会生效。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

