2013-06-16 2 views
0

Я пытаюсь создать приложение весной, используя sfl4j и log4j. Я прочитал и выполнил все инструкции об удалении общедоступных записей из весеннего контекста. Тем не менее, я продолжаю получать ту же ошибку:NoSuchMethodError для SLF4J

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListenerjava.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V 
    at org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:159) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:273) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) 
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:657) 
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:536) 
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1462) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301) 
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) 
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:792) 
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1445) 
    at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:860) 
    at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:357) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    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:722) 

Вот мой pom.xml:

`

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${spring.version}</version>    
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${spring.version}</version>   
     <exclusions> 
      <exclusion> 
       <groupId>commons-logging</groupId> 
       <artifactId>commons-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency>       
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>taglibs</groupId> 
     <artifactId>standard</artifactId> 
     <version>1.1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>6.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.2.2.Final</version> 
    </dependency>    
    <dependency> 
     <groupId>net.sf.jasperreports</groupId> 
     <artifactId>jasperreports</artifactId> 
     <version>5.1.0</version> 
     <exclusions> 
     <exclusion> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-api</artifactId> 
     <version>3.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.velocity</groupId> 
     <artifactId>velocity</artifactId> 
     <version>1.7</version> 
    </dependency>       
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.0.1.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context-support</artifactId> 
     <version>${spring.version}</version> 
    </dependency>   
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
    </dependency> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.9.5</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>paypal.payflow</groupId> 
     <artifactId>payflow-sdk</artifactId> 
     <version>4.31</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>${slf4jVersion}</version>     
    </dependency>  
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>${slf4jVersion}</version>    
    </dependency>            
</dependencies>` 

Может кто-то пожалуйста, помогите? Я потратил дни, пытаясь понять это.

+0

Это не ваша текущая проблема, но вы должны добавить ' тест' в зависимость от junit. Можете ли вы проверить, существует ли транзитивная зависимость от log4j с областью выполнения, а другая - на 'slf4j-api' с областью компиляции? –

+0

и log4j, и slf4j-api имеют область компиляции. Я попытался изменить их во время выполнения, но когда я изменил эту область на зависимость от Spring-context, классы, использующие эту зависимость, забросили ошибки, поэтому я оставил все для компиляции. – user2490097

+0

Проблемы с областью действия зависят от того, что именно находится в вашем исходном коде; если вы и писатели библиотек дисциплинированы, вам нужно всего лишь log4j во время выполнения. Тогда я просто не знаю. Однако 'junit' должен всегда быть областью тестирования, что не помогает вашей основной проблеме. –

ответ

0

Лучшим способом решения проблемы является включение исходных файлов для ваших библиотек log4j и цепочек цепочек исследований.

  • Убедитесь, что log4j и jcl-over-slf4j успешно развернуты на Tomcat.
  • Используйте grepcode for log4j-api и jcl-over-lsf4j, чтобы проанализировать проблему root и устранить совместимость версии.
  • Убедитесь, что у вас нет конфликтов в вашем пути к классу. Используйте следующий фрагмент кода, чтобы убедиться, что вы загружены классы из библиотеки баночек:

пример:

Class klass = String.class; 
    URL location = klass.getResource('/'+klass.getName().replace('.', '/')+".class"); 

напечатает этот тип строки:

jar:file:/Users/taky/.gradle/caches/artifacts-14/filestore/com.google.inject/guice/3.0/jar/9d84f15fe35e2c716a02979fb62f50a29f38aefa/guice-3.0.jar!/com/google/inject/internal/InjectorImpl.class 
+0

оба jar успешно развернуты на tomcat, и оба используют одну и ту же переменную свойства slf4j.version. Поэтому я не знаю, почему проблема сохраняется. Я буду продолжать исследования. – user2490097

0

Вы пропускаете зависимость для slf4j api:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 

Это определяет api (in terfaces) для slf4j, а другие зависимости реализуют api.

Я рекомендую использовать Logback как реализация: http://logback.qos.ch/reasonsToSwitch.html

Вот полный конфиг использовать SLF4J с Logback:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>log4j-over-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jul-to-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.0.6</version> 
    </dependency> 

Наконец, вам нужно добавить к вашей logback.xml иметь июлю направляется через SLF4J:

<!-- support for jul through logback: http://logback.qos.ch/manual/configuration.html#LevelChangePropagator --> 
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/> 
+0

Я сделал именно то, что вы сказали, но та же ошибка сохраняется. Я добавил зависимости к pom, и я создал файлы logback-xml и logback-access.xml, но та же ошибка сохраняется. Я больше не знаю, что делать. – user2490097

+0

Если у вас есть правильные зависимости в вашем помпе, они не должны попасть в ваше приложение. Как вы запускаете свое приложение? – Solubris

1

@Solubris, ты дал мне правильные указатели. Первоначально он не работал в соответствии с моим ответом на ваш пост, потому что я не удалял все связанные старые файлы slf4j.version, все еще находящиеся в папке lib. Поэтому, когда я удалял все дублированные библиотеки, веб-приложение развертывается просто отлично.

Для любого, кто сталкивается с той же проблемой, пожалуйста, следуйте решению Solubris, а затем ... убедитесь, что вы проверили свою папку lib и удалили все связанные с slf4j банки, имеющие более старые версии. Надеюсь, это может спасти кого-то бесчисленные часы размышлений и обращения к безумию!

0

я нашел в/USR/Библиотека/JVM/Java-6-OpenJDK-amd64/JRE/LIB/ех следующие файлы SLF4J-апи-1.5.6.jar
SLF4J-log4j12-1.5.6. jar

Итак, я удаляю их в пользу тех, которые установлены maven в репозитории (... /.м2/репозиторий), таким образом, проблема была решена.

Смежные вопросы