【发布时间】:2018-06-16 00:46:11
【问题描述】:
我知道由于 (Maven) 依赖管理而导致类路径上的 slf4j 实现丢失或重复的原因,并且知道如何通过排除来避免这种情况。
但是,如果我有一个多模块 Java 项目,其中包含一个包含 EJB 接口和实体的 JAR、一个 EJB 实现和一个打包为 EAR 的 WAR Web 前端,我找不到放置 slf4j API org.slf4j:slf4j-api:1.7.25 的方法,实现ch.qos.logback:logback-classic:1.2.3 和配置logback.xml,这样我就可以在JAR、EJB 和WEB 模块中进行日志记录,并且可以避免both
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
和
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/richter/zpool-tmp/jee-slf4j-logging/jee-slf4j-logging-ear/target/gfdeploy/jee-slf4j-logging-ear/jee-slf4j-logging-web-1.0-SNAPSHOT_war/WEB-INF/lib/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/richter/zpool-tmp/jee-slf4j-logging/jee-slf4j-logging-ear/target/gfdeploy/jee-slf4j-logging-ear/lib/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
和
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/glassfish/web/loader/WebappClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/glassfish/javaee/full/deployment/EarLibClassLoader) for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:418)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
我在 https://gitlab.com/krichter/jee-slf4j-logging 提供 MCVE。
GlassFish 4, no logging framework dependencies is working in pom.xml 未涵盖 Java EE 方面。
【问题讨论】:
-
请注意,日志记录直接访问文件系统,这在完全兼容的应用程序中是不允许的。你可以考虑使用 slf4j 去 java.util.logging 我知道的所有 servlet 容器集中捕获和记录
-
最简单的方法是将所有内容都放在您的 WAR 文件中并进行部署。在正确的位置(甚至使用 Maven)构建正确的 EAR 文件和所有相关的 jar 文件是一件棘手的事情,需要一些时间来解释
-
@SteveC 我知道 WAR 相对于 EAR 打包的优势。我已经体验到能够为 Java EE 开发不同的 Web 客户端并尽可能实现最清晰的分离的优势。所以,我想保留多模块结构。
-
可以尝试查看maven有效pom并搜索重复依赖。也许对你有帮助:stackoverflow.com/questions/15985337/…blog.jetbrains.com/idea/2010/05/maven-dependencies-diagram
-
我在stackoverflow.com/questions/41306341/… 的回答将解释为什么必须将这些jar 放在EAR/lib 目录中。这也意味着您的配置必须在 EAR/lib 目录中的 jar 中或通过系统属性指定,例如
-Dlogback.configurationFile=/path/to/config.xml
标签: java maven jakarta-ee logback slf4j