Grails war无法部署java.lang.NoClassDefFoundError和SLF4J:类路径包含多个SLF4J绑定

时间:2014-10-23 16:39:08

标签: tomcat grails groovy war slf4j

当我使用grails run-app时,我的应用程序运行正常但是当尝试使用带有run-war的war文件运行时,我收到以下错误:

我已经在堆栈上尝试了一些解决方案,但没有一个解决了这个问题。

并且跟踪上显示的包/类来自我的一个域类:

  

嵌套异常是java.lang.NoClassDefFoundError:gneellaan / Ecf

gneellaan = packageEcf = domain class

|Running Grails application
Error |
SLF4J: Class path contains multiple SLF4J bindings.
Error |
SLF4J: Found binding in [jar:file:/C:/grails-2.4.2/dist/grails-plugin-log4j-2.4.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
Error |
SLF4J: Found binding in [jar:file:/C:/Grails/gneellaan/target/work/tomcat/webapps/gneellaan/WEB-INF/lib/grails-plugin-log4j-2.4.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
Error |
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Error |
SLF4J: Actual binding is of type [org.slf4j.impl.GrailsSlf4jLoggerFactory]
2014-10-23 14:28:08,255 [localhost-startStop-1] ERROR context.ContextLoader  - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: gneellaan/Ecf
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: gneellaan/Ecf
    at java.lang.Class.forName(Class.java:340)
    ... 4 more
Caused by: java.lang.ClassNotFoundException: gneellaan.Ecf
    ... 5 more
2014-10-23 14:28:08,257 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener  - Error initializing the application: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: gneellaan/Ecf
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: gneellaan/Ecf
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: gneellaan/Ecf
    at java.lang.Class.forName(Class.java:340)
    ... 4 more
Caused by: java.lang.ClassNotFoundException: gneellaan.Ecf
    ... 5 more
2014-10-23 14:28:08,258 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener  - Error initializing Grails: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: gneellaan/Ecf
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: gneellaan/Ecf
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: gneellaan/Ecf
    at java.lang.Class.forName(Class.java:340)
    ... 4 more
Caused by: java.lang.ClassNotFoundException: gneellaan.Ecf
    ... 5 more
Exception sending context initialized event to listener instance of class org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: gneellaan/Ecf
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: gneellaan/Ecf
    at java.lang.Class.forName(Class.java:340)
    ... 4 more
Caused by: java.lang.ClassNotFoundException: gneellaan.Ecf
    ... 5 more
Error listenerStart
Context [/gneellaan] startup failed due to previous errors
The web application [/gneellaan] registered the JDBC driver [org.h2.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
The web application [/gneellaan] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
The web application [/gneellaan] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.
|Server running. Browse to http://localhost:9091/gneellaan
|Server running. Browse to http://localhost:9091/gneellaan

1 个答案:

答案 0 :(得分:1)

正确 - 它是一个类路径问题,而Slf4j消息是可忽略的警告。 java.lang.ClassNotFoundExceptionjava.lang.NoClassDefFoundError之间存在很大差异。 ClassNotFoundException本身很容易 - 类路径中没有包含该类或资源的jar文件或目录。修复类路径,或将缺少的库添加到其中,然后继续。

但是NoClassDefFoundError(会导致ClassNotFoundException)要难以修复。它表示找到了已命名的类,但在加载它时,它所具有的依赖性未得到满足。当使用Grails,Maven,Gradle等集成依赖关系管理时,这应该是相对罕见的,并确定依赖关系的依赖性并包括这些依赖关系。但是,当我们将查找配置为不通过依赖关系图进行递归,或排除我们认为可以安全排除的一个或多个jar时,就会发生这种情况。

我猜你gneellaan.Ecf是你的班级 - 谷歌正好有1个结果,这就是这个问题(技术上是两个字,但我仍称它为Googlewhack)。如果它是第三方库,您可以使用http://mvnrepository.com/之类的网站来确定依赖关系(例如http://mvnrepository.com/artifact/io.hawt/hawtio-util/1.4.27)。但是你有源头,所以找到原因应该不会太难。如果该课程有很多内容,请尝试评论一下你能做什么,确保每一个仍然编译,但删除你能做的。