【问题标题】:Grails war fails to deploy java.lang.NoClassDefFoundError and SLF4J: Class path contains multiple SLF4J bindingsGrails 战争无法部署 java.lang.NoClassDefFoundError 和 SLF4J:类路径包含多个 SLF4J 绑定
【发布时间】:2014-10-23 16:39:07
【问题描述】:

当我使用 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

【问题讨论】:

    标签: tomcat grails groovy war slf4j


    【解决方案1】:

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

    但是NoClassDefFoundError(这将导致ClassNotFoundException)更难修复。它表示找到了命名类,但在加载它时,它没有满足依赖关系。在使用集成依赖管理的 Grails、Maven、Gradle 等时,这种情况应该比较少见,并确定您的依赖项的依赖项是什么并包括那些。但是,当我们将查找配置为不通过依赖关系图递归,或者排除一个或多个我们认为可以安全排除的 jar 时,就会发生这种情况。

    我猜gneellaan.Ecf 是你的班级 - 在 Google 中正好有 1 个结果,就是这个问题(技术上是两个词,但我仍然称它为 Googlewhack)。如果它是第 3 方库,您可以使用像 http://mvnrepository.com/ 这样的站点来确定依赖关系(例如 http://mvnrepository.com/artifact/io.hawt/hawtio-util/1.4.27)。但是你有源头,所以找到原因应该不难。如果该类中发生了很多事情,请尝试注释掉您可以做的事情,确保所有内容仍然可以编译,但删除您可以做的事情。

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2016-03-12
      • 2014-05-18
      • 2021-05-19
      • 2020-07-07
      • 2019-04-30
      • 2018-12-12
      • 2012-09-11
      相关资源
      最近更新 更多