2015-04-08 11 views
5

próbuje dowiedzieć się, dlaczego ja dostaję następujący błąd w Tomcat dzienników:SLF4J błąd: ładowarka klasy mają różne klasy obiektów dla rodzaju

Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature 

W moim Gradle plików używam slf4j wersji 1.7. 7, aw tomcat mam jul-to-slf4j-1.7.7.jar i slf4j-api-1.7.7.jar, więc jestem całkiem zdezorientowany.

Oto ślad stosu - dziękuję za pomoc!

Total time: 2.982 secs 
Using CATALINA_BASE: /usr/local/Cellar/tomcat/8.0.18/libexec 
Using CATALINA_HOME: /usr/local/Cellar/tomcat/8.0.18/libexec 
Using CATALINA_TMPDIR: /usr/local/Cellar/tomcat/8.0.18/libexec/temp 
Using JRE_HOME:  /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home 
Using CLASSPATH:  /usr/local/Cellar/tomcat/8.0.18/libexec/bin/jul-to-slf4j-1.7.7.jar:/usr/local/Cellar/tomcat/8.0.18/libexec/bin/slf4j-api-1.7.7.jar:/usr/local/Cellar/tomcat/8.0.18/libexec/bin/logback-classic-1.1.2.jar:/usr/local/Cellar/tomcat/8.0.18/libexec/bin/logback-core-1.1.2.jar:/usr/local/Cellar/tomcat/8.0.18/libexec/bin/logback-config/:/usr/local/Cellar/tomcat/8.0.18/libexec/bin/bootstrap.jar:/usr/local/Cellar/tomcat/8.0.18/libexec/bin/tomcat-juli.jar 
19:03:55.979 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Server version:  Apache Tomcat/8.0.18 
19:03:55.981 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Server built:   Jan 23 2015 11:56:07 UTC 
19:03:55.981 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Server number:   8.0.18.0 
19:03:55.982 [main] INFO org.apache.catalina.startup.VersionLoggerListener - OS Name:    Mac OS X 
19:03:55.982 [main] INFO org.apache.catalina.startup.VersionLoggerListener - OS Version:   10.10 
19:03:55.982 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Architecture:   x86_64 
19:03:55.982 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Java Home:    /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre 
19:03:55.982 [main] INFO org.apache.catalina.startup.VersionLoggerListener - JVM Version:   1.8.0_25-b17 
19:03:55.982 [main] INFO org.apache.catalina.startup.VersionLoggerListener - JVM Vendor:   Oracle Corporation 
19:03:55.982 [main] INFO org.apache.catalina.startup.VersionLoggerListener - CATALINA_BASE:   /usr/local/Cellar/tomcat/8.0.18/libexec 
19:03:55.983 [main] INFO org.apache.catalina.startup.VersionLoggerListener - CATALINA_HOME:   /usr/local/Cellar/tomcat/8.0.18/libexec 
19:03:55.983 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Command line argument: -Djava.util.logging.config.file=/usr/local/Cellar/tomcat/8.0.18/libexec/conf/logging.properties 
19:03:55.983 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 
19:03:55.983 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Command line argument: -Djava.endorsed.dirs=/usr/local/Cellar/tomcat/8.0.18/libexec/endorsed 
19:03:55.983 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Command line argument: -Dcatalina.base=/usr/local/Cellar/tomcat/8.0.18/libexec 
19:03:55.984 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Command line argument: -Dcatalina.home=/usr/local/Cellar/tomcat/8.0.18/libexec 
19:03:55.984 [main] INFO org.apache.catalina.startup.VersionLoggerListener - Command line argument: -Djava.io.tmpdir=/usr/local/Cellar/tomcat/8.0.18/libexec/temp 
19:03:55.984 [main] INFO org.apache.catalina.core.AprLifecycleListener - The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /Users/jadekler/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 
19:03:56.076 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"] 
19:03:56.092 [main] INFO org.apache.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read 
19:03:56.094 [main] INFO org.apache.coyote.ajp.AjpNioProtocol - Initializing ProtocolHandler ["ajp-nio-8009"] 
19:03:56.096 [main] INFO org.apache.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read 
19:03:56.096 [main] INFO org.apache.catalina.startup.Catalina - Initialization processed in 510 ms 
19:03:56.115 [main] INFO org.apache.catalina.core.StandardService - Starting service Catalina 
19:03:56.115 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet Engine: Apache Tomcat/8.0.18 
19:03:56.132 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deploying web application archive /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/websiteskeleton.war 
19:03:56.812 [localhost-startStop-1] ERROR org.apache.catalina.core.StandardContext - Error during ServletContainerInitializer processing 
javax.servlet.ServletException: Failed to instantiate WebApplicationInitializer class 
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:160) ~[spring-web-4.1.0.RELEASE.jar:4.1.0.RELEASE] 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5143) ~[catalina.jar:8.0.18] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.18] 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) [catalina.jar:8.0.18] 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) [catalina.jar:8.0.18] 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714) [catalina.jar:8.0.18] 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917) [catalina.jar:8.0.18] 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701) [catalina.jar:8.0.18] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_25] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_25] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25] 
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature 
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:306) ~[slf4j-api-1.7.7.jar:1.7.7] 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276) ~[slf4j-api-1.7.7.jar:1.7.7] 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:288) ~[slf4j-api-1.7.7.jar:1.7.7] 
    at com.websiteskeleton.core.HelloInitializer.<init>(HelloInitializer.java:13) ~[HelloInitializer.class:na] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_25] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_25] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_25] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) ~[na:1.8.0_25] 
    at java.lang.Class.newInstance(Class.java:438) ~[na:1.8.0_25] 
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:157) ~[spring-web-4.1.0.RELEASE.jar:4.1.0.RELEASE] 
    ... 12 common frames omitted 
19:03:56.821 [localhost-startStop-1] ERROR org.apache.catalina.core.StandardContext - Context [/websiteskeleton] startup failed due to previous errors 
19:03:56.825 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deployment of web application archive /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/websiteskeleton.war has finished in 693 ms 
19:03:56.826 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deploying web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/docs 
19:03:56.893 [localhost-startStop-1] INFO org.apache.jasper.servlet.TldScanner - At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
19:03:56.904 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deployment of web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/docs has finished in 78 ms 
19:03:56.904 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deploying web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/examples 
19:03:57.133 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deployment of web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/examples has finished in 228 ms 
19:03:57.133 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deploying web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/host-manager 
19:03:57.192 [localhost-startStop-1] INFO org.apache.jasper.servlet.TldScanner - At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
19:03:57.195 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deployment of web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/host-manager has finished in 62 ms 
19:03:57.195 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deploying web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/manager 
19:03:57.252 [localhost-startStop-1] INFO org.apache.jasper.servlet.TldScanner - At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
19:03:57.254 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deployment of web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/manager has finished in 59 ms 
19:03:57.254 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deploying web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/ROOT 
19:03:57.307 [localhost-startStop-1] INFO org.apache.jasper.servlet.TldScanner - At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
19:03:57.308 [localhost-startStop-1] INFO org.apache.catalina.startup.HostConfig - Deployment of web application directory /usr/local/Cellar/tomcat/8.0.18/libexec/webapps/ROOT has finished in 54 ms 
19:03:57.310 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"] 
19:03:57.314 [main] INFO org.apache.coyote.ajp.AjpNioProtocol - Starting ProtocolHandler ["ajp-nio-8009"] 
19:03:57.315 [main] INFO org.apache.catalina.startup.Catalina - Server startup in 1218 ms 

Odpowiedz

12

Tomcat dziennika pokazuje masz inny slf4j-1.7.7.jar na ścieżce klas:

Korzystanie CLASSPATH: /usr/local/Cellar/tomcat/8.0.18/libexec/bin/jul -to-slf4j-1.7.7.jar: /usr/local/Cellar/tomcat/8.0.18/libexec/bin/slf4j-api-1.7.7.jar: /usr/local/Cellar/tomcat/8.0 .18/libexec/bin/logback-classic-1.1.2.jar: /usr/local/Cellar/tomcat/8.0.18/libexec/bin/logback-core-1.1.2.jar:/usr/local/Cellar /tomcat/8.0.18/libexec/bin/logback-config/:/usr/local/Cellar/tomcat/8.0.18/libexec/bin/bootstrap.jar:/usr/local/Cellar/tomcat/8.0.18/ libexec/bin/tomcat-juli.jar

Po zainicjowaniu Tomcat, inicjalizuje jul-to-slf4j i slf4j-api. Te słoiki są ładowane przez Classloader, który ładował słoiki Tomcat (słońce/misc/Launcher $ AppClassLoader).

Kiedy twoja aplikacja próbuje uzyskać dostęp do klas slf4j-api, używa aplikacji WebApplication Classloader (org/apache/catalina/loader/WebappClassLoader), która domyślnie szuka definicji klas w ścieżce klas aplikacji przed ścieżką klasy systemu. Uwaga: Można to zmienić: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

W języku Java podpis klasy składa się z pełnej klasy nazwy klasy i klasy ładującej klasę. Jeśli klasa zostanie załadowana dwa razy z dwóch różnych programów ładujących klasy (ta sama hierarchia), dla JVM będą dwie różne klasy. Próba wskazania odniesienia do obiektu jednej klasy do zmiennej drugiej spowoduje wykrycie wyjątku ClassCastException. Więcej informacji na ten temat na blogu (pozycja 5): https://techblug.wordpress.com/2012/03/17/classloader-tips/

Tak więc, o ile wiem, można to naprawić, usuwając słoik slf4j - *. Ze ścieżki klasy Tomcat, lub jeśli masz więcej niż jeden webapp przy użyciu tej samej wersji slf4j, możesz usunąć słoiki z aplikacji webapp, więc użyje tych załadowanych przez program ładujący klasy Tomcat.

+0

Więc, jeśli miałbym usunąć jar slf4j z kosza tomcat, co robisz podczas logowania? Podobnie jak w moim conf/logging.properties Mam handlers = org.slf4j.bridge.SLF4JBridgeHandler. Kiedy słoik slf4j nie znajduje się w ścieżce klasy tomcat, to BridgeHandler wysadzi w powietrze. (konkretnie, java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory) – Jean

+0

Możesz zachować slf4j z tomcat lib, ale zmień kolejność wyszukiwania klasy. Sprawdź link tomcat-8-doc/classloader, który napisałem powyżej. Część . – DiogoSantana

Powiązane problemy