2014-06-21 15 views
5

wciąż otrzymuję następujący błąd:Tomcat ClassNotFoundException: org.slf4j.spi.LoggerFactoryBinder ale slf4j jest w libs

Failed to instantiate SLF4J LoggerFactory 
Reported exception: 
java.lang.NoClassDefFoundError: org/slf4j/spi/LoggerFactoryBinder 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:270) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1562) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1420) 
     at org.slf4j.LoggerFactory.bind(LoggerFactory.java:129) 
     at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:108) 
     at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:302) 
     at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276) 
     at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156) 
     at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132) 
     at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:274) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:282) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4830) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5276) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726) 
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702) 
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:698) 
     at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:968) 
     at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1742) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.ClassNotFoundException: org.slf4j.spi.LoggerFactoryBinder 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
     ... 37 more 
21-Jun-2014 17:06:51.352 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Error listenerStart 
21-Jun-2014 17:06:51.358 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [/spring-app] startup failed due to previous errors 
21-Jun-2014 17:06:51.399 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /media/win/d/coding/servers/tomcat/apache-tomcat-8.0.0-RC5/webapps/docs 
21-Jun-2014 17:06:51.829 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /media/win/d/coding/servers/tomcat/apache-tomcat-8.0.0-RC5/webapps/examples 
21-Jun-2014 17:06:53.181 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /media/win/d/coding/servers/tomcat/apache-tomcat-8.0.0-RC5/webapps/host-manager 
21-Jun-2014 17:06:53.575 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /media/win/d/coding/servers/tomcat/apache-tomcat-8.0.0-RC5/webapps/manager 
21-Jun-2014 17:06:53.950 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /media/win/d/coding/servers/tomcat/apache-tomcat-8.0.0-RC5/webapps/ROOT 
21-Jun-2014 17:06:54.324 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 
21-Jun-2014 17:06:54.328 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"] 
21-Jun-2014 17:06:54.329 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 9393 ms 
21-Jun-2014 17:07:14.840 INFO [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.undeploy Undeploying context [/spring-app] 
21-Jun-2014 17:07:44.907 INFO [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /media/win/d/coding/servers/tomcat/apache-tomcat-8.0.0-RC5/webapps/spring-app.war 
Failed to instantiate SLF4J LoggerFactory 
Reported exception: 
java.lang.NoClassDefFoundError: org/slf4j/spi/LoggerFactoryBinder 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:270) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1562) 
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1420) 
     at org.slf4j.LoggerFactory.bind(LoggerFactory.java:129) 
     at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:108) 
     at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:302) 
     at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276) 
     at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156) 
     at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132) 
     at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:274) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:282) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4830) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5276) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726) 
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702) 
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:698) 
     at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:968) 
     at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1742) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:744) 
Caused by: java.lang.ClassNotFoundException: org.slf4j.spi.LoggerFactoryBinder 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
     ... 37 more 

to nie ma sensu, ponieważ ZROBIĆ mieć org.slf4j.spi.LoggerFactoryBinder w web-app/WEB-INF/lib/slf4j-api-1.7.6.jar i to działało także wczoraj, ale nagle nie można uruchomić aplikacji internetowej.

Co może być przyczyną?
Jak mogę sprawdzić/debugować ścieżkę klas dla aplikacji internetowej w Tomcat na początku?

Odpowiedz

0

Jeśli używasz Tomcata ze skryptami catalina.sh (lub .bat) - które są używane przez startup.sh i shutdown.sh), możesz zmodyfikować zmienną JAVA_OPTS tak, aby zawierała "-verbose: class "przełącznik. Że spowoduje informacje o klasach ładowane mają być drukowane na standardowe wyjście

Odnośnie problemu, mam wrażenie, że tam może być jakaś starsza wersja słoika, które mogą być sprzeczne

13

Mówisz, że słoik slf4j API (był) częścią aplikacji internetowej. Zgaduję, że twój słoik jest zainstalowany (był) w katalogu Tomcat o numerze lib lub w innym miejscu, w którym nie był on prywatny dla aplikacji internetowej. Wygląda na to, że powinien to być naturalny sposób korzystania z Slf4j - aplikacja internetowa przynosi ze sobą słoik API, a instalacja tomcat zapewnia poprawne powiązanie. Niestety to nie działa.

Patrz: Tomcat classloader how-to. Kiedy Slf4j jest wdrożony w ten sposób, jar interfejsu API jest ładowany za pomocą prywatnego programu ładującego klasy dla aplikacji internetowej, podczas gdy słoik do wiązania jest ładowany za pomocą "wspólnego" programu ładującego klasy lub jednego z innych ogólnych programów ładujących klasy. Klasy w programie ładującym klasy webapp mogą ładować klasy ze wspólnego programu ładującego, ale klasy we wspólnym programie ładującym nie mają dostępu do programu ładującego Webapp.

W szczególności wyjątek występuje wtedy, gdy klasa w jar API próbuje załadować klasę w słoiku, czyli org.slf4j.impl.StaticLoggerBinder. Twój kod w aplikacji internetowej może uzyskać dostęp do jar API, a jar interfejsu API może znaleźć tę klasę w słoju powiązania. Jednak odwołanie StaticLoggingBinder org.slf4j.spi.LoggerFactoryBinder, które jest ponownie w słoiku API. Klasy w słoju wiążącym nie mogą uzyskać dostępu do modułu ładującego klasy webapp, więc nie można załadować klasy i otrzymasz wyjątek.

Niestety, jedynym prostym rozwiązaniem jest wdrożenie zarówno Slf4j API, jak i słoików wiążących w tym samym "miejscu". Powinny one należeć zarówno do prywatnych klas aplikacji internetowej, jak i obu części wspólnych klas Tomcat.

Powiązane problemy