我的一个项目被打包为一个 EAR 文件,其中包含 SLF4J API (1.7.5) 以及作为其实现的 logback 库 (logback-core 1.0.13
和logback-classic 1.0.13
)。
当我(曾经)部署我的项目时,SLF4J 的 LoggerFactory 发现 logback 作为可能的绑定并使用了正确的记录器(即 logback)。
现在我有一个资源连接器 ( activemq-rar-5.8.0.rar
),它部署在我自己的 EAR 文件之前(因为 EAR 文件需要 RAR)。不幸的是,这个 RAR 包含它自己的 SLF4J 实现(slf4j-api-1.6.6.jar
slf4j-log4j12-1.6.6.jar
log4j-1.2.17.jar
)。RAR 文件使用 log4j 实现。
当我部署我的 EAR 文件时,我的应用程序代码中的 LoggerFactory 突然使用 log4j 实现 ( org.slf4j.impl.Log4jLoggerAdapter
) - 即使我希望类路径与 RAR 分开。
情况似乎并非如此 - 那么我做错了什么(RAR 应该使用 log4j,我的 EAR 应该使用 logback)?
更新 1: 看起来我并不孤单,但不幸的是缺少答案..
更新 2:
根据该表,GlassFish 在 EAR/WAR 库(这是最后加载的库)之前加载连接器模块。
更新 3:
我设法修复了“绑定”:如果我将slf4j-api-1.7.5.jar
和 logback 实现(logback-core-1.0.13.jar
和logback-classic-1.0.13.jar
)放在domains/<myDomain>/lib
GlassFish 中的文件夹中,logback 将用作日志记录实现(请参阅更新 2 - “Common Classloader”位于“Connector Classloader”之前)。
不幸的是,我的配置文件已经找不到了,因为它们在 WAR/EAR 中——稍后将由不同的类加载器(“归档类加载器”)加载。
所以这对我来说并不是一个真正的解决方案,因为我想将 logback 配置文件保留在 EAR/WAR 中(因为每个应用程序都使用不同的配置)。
亲切的问候
愚蠢的羊