slf4j-api冲突
我正在使用querydsl(取决于sl4j-api 1.6)和arquillian-persistence-api(取决于slf4j-jdk14 1.5.6)。 如果我在Maven中的旧版本1.5.6,我得到在JBossslf4j-api冲突
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.
我使用的Arquillian与管理的JBoss AS 7.1进行测试(Maven的下载从行家中心的版本,并运行测试)。 我也使用arquillian持久api。
我应该怎么做才能纠正给定的警告?我的意思是我应该保持哪种依赖性,或者我会如何让两者正常工作?
我想这就是为什么我没有得到关于arquillian持久性api失败的任何错误消息(因为记录器不工作?)。
您看到的消息是警告,而不是错误。这意味着SLF4J正在为您选择一个绑定,因为您没有自己选择。默认绑定只是丢弃所有日志消息,这不是很有用。
如果你在Maven中有冲突的版本,通常强制更新版本更安全。库是往往向后兼容。
因此,坚持使用您的新版本slf4j-api
,并确保您将绑定声明为依赖项。 slf4j-jdk14
。如果您正在制作库,请确保您的绑定仅以test
作用域声明。
我在一个库中有'slf4j-api 1.6.1',在另一个库中有'slf4j-jdk14 1.5.6'。两者都需要在编译范围内。这不是一个库生产,而是一个普通的j2ee应用程序,我不能编辑原始的依赖关系(或者如果可能,我该怎么做?)。我应该排除旧的库,并在库依赖关系之外添加绑定依赖关系吗? – 2013-02-24 18:45:44
@FagnerBrack在您的POM中声明您的首选'slf4j-api'版本 - 这将覆盖所有其他版本。如果你不想'slf4j-jdk14',那么在包含它的库中添加一个排除。如果你想要它,但是不同的版本,只需在你的POM中声明你的首选版本。 – 2013-02-24 20:13:05
@FagnerBrack如果您需要进一步的帮助,请编辑问题以共享POM文件的相关部分,并包含'mvn dependency:tree'的输出。 – 2013-02-24 20:14:12
JBoss 7.1内置了对SLF4J的支持。假设这是战争打包的Web应用程序添加src/main/webapp/WEB-INF/jboss-deployment-structure.xml
:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<dependencies>
<module name="org.slf4j" />
</dependencies>
</deployment>
</jboss-deployment-structure>
这将在JBoss SL4J适配器,它会给你记录输出拉。
这意味着您要使用应用程序服务器提供的SLF4J库。你应该更新你的pom.xml
来修复SLF4J依赖的范围。
<dependencies>
...
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
...
</dependencies>
根据您的POM文件的排列方式,您可能还需要提供您想要使用的SLF4J版本。 mvn dependency:tree
可以向您显示哪些SLF4J折弯被拉入。确保他们都获得“提供”的范围。如果你使用Eclipse和m2e插件,你也可以打开你的POM文件并检查“Dependency Hierarchy”选项卡,它将为你提供类似的信息。
我应该忽略maven库中的所有slf4j依赖关系还是这个配置会覆盖所有内容? – 2013-02-26 14:03:59
使用此配置意味着您希望SLF4J内容由应用程序服务器提供。我会建议将范围设置为“提供”。这样SLF4J的东西就不会被打包到你的WAR文件中。相反,JBoss将被指示将其从模块中拉入到类路径中。 如果您使用'mvn dependency:tree'插件,您可以看到什么被拉入以及它的范围,正如@Duncan Jones建议的那样。如果你在你的pom中声明'slf4j-api',并使用提供的范围,它将覆盖querydsl中声明的范围。 – 2013-02-27 08:45:26
首先。关于依赖关系。
为了增加SLF4J你必须把ONE只有ONE在你的pom.xml这些依赖关系。这取决于您选择使用的实施方式。您在pom.xml中添加的每个依赖项都会自动添加到类路径中。如果以下依赖项之一由另一个依赖项提供,则可以省略它。不要忘记,即使依赖关系是由其他依赖项提供的,也只能包含一个。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version></version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version></version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version></version>
<scope>compile</scope>
</dependency>
现在关于构建Maven项目时,你所得到的恼人的错误。如果只有以上依赖项之一,仍然会得到SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。那么你正面临着m2e的一个bug。
当使用捆绑maven版本(m2e)时,Eclipse Juno和Indigo不禁止消息SLF4J:未能加载类“org.slf4j.impl.StaticLoggerBinder”。此行为在m2e 1.1.0.20120530-0009及之后的版本中提供。
虽然这表示为错误,您的日志将正常保存。突出显示的错误仍然存在,直到修复此错误。更多关于m2e support site的信息。
当前可用的解决方案是使用外部maven版本而不是捆绑版本的Eclipse。你可以在下面的问题中找到关于这个解决方案和更多关于这个bug的细节,我认为它描述了你面临的同样的问题。
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". error
您是否阅读过您发布的slf4j日志消息中链接的页面? – 2013-02-24 04:59:47
您是否将Eclipse用作IDE? – 2013-03-01 08:37:47
是的,我使用Eclipse作为IDE – 2013-03-01 15:56:08