【发布时间】:2013-08-10 00:37:33
【问题描述】:
我的一个项目被打包为一个 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.jarslf4j-log4j12-1.6.6.jarlog4j-1.2.17.jar)。
RAR 文件使用 log4j 实现。
当我部署我的 EAR 文件时,我的应用程序代码中的 LoggerFactory 突然使用 log4j 实现 (org.slf4j.impl.Log4jLoggerAdapter) - 即使我希望类路径与 RAR 分开。
这似乎不是这样 - 那我做错了什么(RAR 应该使用 log4j,我的 EAR 应该使用 logback)?
更新 1: It doesn't look as if I am alone,可惜没有答案..
更新 2:
根据this 表,GlassFish 在 EAR/WAR 库(最后加载的库)之前加载连接器模块。
更新 3:
我设法修复了“绑定”:如果我将 slf4j-api-1.7.5.jar 和 logback 实现(logback-core-1.0.13.jar 和 logback-classic-1.0.13.jar)放在 GlassFish 的 domains/<myDomain>/lib 文件夹中,logback 将用作日志记录实现(请参阅更新 2 - “Common Classloader” 位于 “Connector Classloader” 之前)。
很遗憾,我的配置文件已在 WAR/EAR 中找不到了 - 稍后将由不同的类加载器(“归档类加载器”)加载。
所以这对我来说并不是一个真正的解决方案,因为我想将 logback 配置文件保留在 EAR/WAR 中(因为每个应用程序都使用不同的配置)。
亲切的问候
笨羊
【问题讨论】:
-
为什么要将 log4j 打包成依赖?容器不能照顾日志配置并提供 impl 吗?
-
我自己不会将 log4j 打包为依赖项。它位于 Apache ActiveMQ (activemq.apache.org/maven/5.8.0/activemq-rar/dependencies.html) 提供的 RAR(资源适配器)中。这些 JAR 文件与一些日志配置文件一起在 RAR 中。
标签: java glassfish classpath activemq slf4j