我的应用程序将部署在tcServer和WebSphere 6.1上。这个应用程序使用ehCache,因此需要slf4j作为依赖项。
因此,我将slf4j-api.jar (1.6) jar添加到war文件包中。
应用程序在tcServer中正常工作,除了以下错误:
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.
然而,当我在WebSphere中部署时,我得到了一个java.lang.NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder。
同时伴有加载类“org.slf4j.impl.StaticMDCBinder”失败
我已经检查了两个应用服务器的类路径,没有其他slf4j jar。
有人知道这里会发生什么吗?
正如SLF4J手册所述
Java的简单日志Facade (SLF4J)就是一个简单的Facade
或者对各种日志框架进行抽象,例如
java.util。日志、logback和log4j。
and
一旦向类路径添加绑定,警告就会消失。
因此,您应该选择要使用哪种绑定。
NoOp绑定(slf4j-nop)
绑定NOP,无声地丢弃所有日志记录。
在https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-nop&core=gav上查看新版本
简单绑定(slf4j-simple)
输出所有事件到System.err。只打印INFO及以上级别的消息。这种绑定在小型应用程序上下文中可能很有用。
在https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-simple&core=gav上查看新版本
日志框架的绑定(java.util。日志,logback, log4j)
如果要将日志写入文件,则需要其中一个绑定。
参见https://www.slf4j.org/manual.html#projectDep上的描述和说明
我的意见
我推荐Logback,因为它是log4j项目的后续产品。
在https://search.maven.org/search?q=g:ch.qos.logback%20AND%20a:logback-classic&core=gav上查看绑定的最新版本
你可以获得控制台输出,但如果你需要将日志写入文件,只需将FileAppender配置放在src/main/resources/logback.xml或src/test/resources/logback-test.xml,就像这样:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/logs.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<logger level="DEBUG" name="com.myapp"/>
</configuration>
(详见手册:https://logback.qos.ch/manual/configuration.html)
正如SLF4J手册所述
Java的简单日志Facade (SLF4J)就是一个简单的Facade
或者对各种日志框架进行抽象,例如
java.util。日志、logback和log4j。
and
一旦向类路径添加绑定,警告就会消失。
因此,您应该选择要使用哪种绑定。
NoOp绑定(slf4j-nop)
绑定NOP,无声地丢弃所有日志记录。
在https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-nop&core=gav上查看新版本
简单绑定(slf4j-simple)
输出所有事件到System.err。只打印INFO及以上级别的消息。这种绑定在小型应用程序上下文中可能很有用。
在https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-simple&core=gav上查看新版本
日志框架的绑定(java.util。日志,logback, log4j)
如果要将日志写入文件,则需要其中一个绑定。
参见https://www.slf4j.org/manual.html#projectDep上的描述和说明
我的意见
我推荐Logback,因为它是log4j项目的后续产品。
在https://search.maven.org/search?q=g:ch.qos.logback%20AND%20a:logback-classic&core=gav上查看绑定的最新版本
你可以获得控制台输出,但如果你需要将日志写入文件,只需将FileAppender配置放在src/main/resources/logback.xml或src/test/resources/logback-test.xml,就像这样:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/logs.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<logger level="DEBUG" name="com.myapp"/>
</configuration>
(详见手册:https://logback.qos.ch/manual/configuration.html)
您的问题很可能是因为<scope>test</scope>(在某些情况下也<scope>提供</scope>),正如前面提到的@thangaraj。
文档中说:
此范围表示正常情况下不需要依赖项
应用程序的使用,并且仅可用于测试编译
以及执行阶段。测试依赖关系是不可传递的,并且只存在于测试和执行类路径中。
所以,如果你不需要测试依赖项,那么你可以使用代替(你将在mvnrepository中看到的):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.24</version>
<scope>test</scope>
</dependency>
没有任何作用域(默认情况下,如果没有提供其他作用域,则为编译作用域):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
</dependency>
这相当于:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>