2012-09-27 24 views
5

我正在研究Java项目并使用Maven(m2e)构建它。当我做一个mvn clean install我得到这个错误的第一件事:Java,Maven:构建期间出现SLF4J错误

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-simple添加到了我的依赖项中。我不知道要使用哪个版本,所以我获得了最新版本(1.7.1)。错误没有消失。

看来我的一个依赖项(JXL)需要log4j版本1.2.14,这就是需要slf4j。我不认为我能改变这个(我可以吗?)。我的想法是,也许slf4j是错误的版本,但我不知道如何找出log4j需要什么版本。

那么首先,我还有问题吗?其次,即使我不这样做,是否有办法摆脱这些警告?

这里是mvn dependency:tree输出:

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ dpt --- 
[INFO] com.nike.dpt:dpt:war:1.3-SNAPSHOT 
[INFO] +- javax.servlet:jsp-api:jar:2.0:provided 
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided 
[INFO] +- javax.servlet:jstl:jar:1.2:runtime 
[INFO] +- net.sourceforge.jexcelapi:jxl:jar:2.6.12:compile 
[INFO] | \- log4j:log4j:jar:1.2.14:compile 
[INFO] +- commons-dbcp:commons-dbcp:jar:1.4:compile 
[INFO] | \- commons-pool:commons-pool:jar:1.5.4:compile 
[INFO] +- org.springframework:spring-core:jar:3.1.2.RELEASE:compile 
[INFO] | +- org.springframework:spring-asm:jar:3.1.2.RELEASE:compile 
[INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile 
[INFO] +- org.springframework:spring-tx:jar:3.1.2.RELEASE:compile 
[INFO] | +- aopalliance:aopalliance:jar:1.0:compile 
[INFO] | +- org.springframework:spring-aop:jar:3.1.2.RELEASE:compile 
[INFO] | \- org.springframework:spring-beans:jar:3.1.2.RELEASE:compile 
[INFO] +- org.springframework:spring-aspects:jar:3.1.2.RELEASE:compile 
[INFO] | \- org.springframework:spring-context-support:jar:3.1.2.RELEASE:compile 
[INFO] +- org.springframework:spring-jdbc:jar:3.1.2.RELEASE:compile 
[INFO] +- org.springframework:spring-web:jar:3.1.2.RELEASE:compile 
[INFO] +- org.springframework:spring-webmvc:jar:3.1.2.RELEASE:compile 
[INFO] | \- org.springframework:spring-expression:jar:3.1.2.RELEASE:compile 
[INFO] +- org.springframework:spring-context:jar:3.1.2.RELEASE:compile 
[INFO] +- org.springframework.security:spring-security-core:jar:3.1.0.RELEASE:compile 
[INFO] | \- org.springframework.security:spring-security-crypto:jar:3.1.0.RELEASE:compile 
[INFO] +- org.springframework.security:spring-security-config:jar:3.1.0.RELEASE:compile 
[INFO] +- org.springframework.security:spring-security-web:jar:3.1.0.RELEASE:compile 
[INFO] +- com.vaadin:vaadin:jar:6.8.2:compile 
[INFO] +- com.google.gwt:gwt-user:jar:2.4.0:provided 
[INFO] | +- javax.validation:validation-api:jar:1.0.0.GA:provided 
[INFO] | \- javax.validation:validation-api:jar:sources:1.0.0.GA:provided 
[INFO] +- org.aspectj:aspectjrt:jar:1.7.0:compile 
[INFO] +- org.aspectj:aspectjweaver:jar:1.7.0:compile 
[INFO] +- junit:junit:jar:4.10:test 
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.1:test 
[INFO] +- org.mockito:mockito-all:jar:1.9.0:test 
[INFO] +- cglib:cglib-nodep:jar:2.2.2:compile 
[INFO] +- com.oracle:ojdbc14:jar:10.2.0.4.0:compile 
[INFO] +- org.vaadin.addons:filteringtable:jar:0.5.3:compile 
[INFO] +- org.vaadin.addons:popupbutton:jar:1.2.1:compile 
[INFO] \- org.slf4j:slf4j-simple:jar:1.7.1:compile 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.1:compile 

我在使用Maven插件(M2E)在Eclipse(麦浚龙)IDE运行。我用于Maven的CLI是mvn clean package taomcat7:runmvn clean install tomcat7:run。当我从命令行调用Maven时,我做的是而不是看到slf4j错误,所以也许这与m2e或Eclipse设置有关。

+1

是否包含SLF4J在Maven的依赖和部署路径,似乎SLF4J未找到在部署文件夹中。 – Elbek

+0

我不确定部署文件夹是什么,对不起。我在Eclipse中,我可以看到Maven Dependencies下的slf4j jar。 – ksnortum

+0

工件,当您部署项目时,需要将所有必需的库复制到WEB-INF/lib文件夹下。如果没有找到它,那么jar就会丢失。 – Elbek

回答

7

错误消息与您的项目无关。这是一个m2e问题,不会造成任何伤害。如果您在Eclipse之外的命令行上构建,则不会看到它。

有一个bug关于这一点,但遗憾的是他们都比较愿意混淆peole不是修复它:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=387064

0

遵循这个规则:

Place one (and only one) of slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar 
+0

我做到了,但没有解决问题。 – ksnortum

1

mvn dependency:tree输出清楚地表明,这两种SLF4J的API和SLF4J,简单的是你的类路径上。这SLF4J抱怨找不到org.slf4j.impl.StaticLoggerBinder,这意味着有SLF4J-api.jar中某处你的classpath的另一个副本,这是副本加载到内存(而不是SLF4J-api.jar中的副本com.nike.dpt:dpt:war)。在这种情况下,由于许多应用程序服务器的类加载器委托模型,服务器的slf4j-api副本加载的类无法找到位于您的Web应用程序中的slf4j-simple.jar中打包的类。通常,当SLF4J-api.jar文件的副本放置在应用服务器的lib/文件夹,而不是你的web应用程序的WEB-INF/lib目录/文件夹发生这种情况。

什么是您的运行时环境?应用服务器?

+0

我进入了'target/dpt/WED-INF/lib',我只看到了'slf4j-api-1.7.1.jar'和'slf4j-simple-1.7.1.jar'。这是我应该看的地方,还是其他地方? – ksnortum

+0

slf4j错误代码页说:“SLF4J API被设计为一次绑定一个底层日志框架,如果类路径中存在多个绑定,SLF4J会发出一个警告,列出它们的位置绑定“。我没有看到地点列表,所以我们可以假设我没有多个罐子? – ksnortum

+0

你应该看看你的应用服务器的lib /文件夹。通过应用程序服务器,我的意思是Tomcat,Jetty,JBoss,Weblogic等。为这些文件夹命名:$ TOMCAT_HOME/lib,$ JBOSS/server/lib /,$ WEBLOGIC/some/path等。您看到的错误是在“org.slf4j.impl.StaticLoggerBinder类无法加载到内存中”时报告,因为找不到它。它与多个绑定无关。 – Ceki

0

尝试配置您的POM这些依赖关系:

org.slf4j:slf4j-api:jar:1.7.1:compile 
org.slf4j:slf4j-log4j12:jar:1.7.1:runtime 

SLF4J的API是日志API,并且需要在编译的时候,而SLF4J-log4j12是实现(使用log4j的),并且它在运行时需要。

+0

我刚刚试过。不用找了。 – ksnortum

+0

你的解释是令人惊讶的似是而非,但不幸的是错误。据我所知,“运行时”范围与“编译”的不同之处在于,运行时范围中的依赖关系不是可传递的(在这种情况下不应该有所区别)。因此,将slf4j-log4j范围作为运行时范围应该对手头的问题没有影响。 – Ceki