2017-05-20 3 views
2

나는 폭풍우를 파이썬과 함께 사용하고 있습니다. 내가NoSuchMethodError : org.slf4j

있어 slf4j의 부분은 내가 토폴로지 로컬

mvn compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=my.Topology 

를 실행하려면이 명령을 사용하여이 오류 내가 여기 slf4j 과의 버전을 확인하려면이 명령 mvn dependency:tree을 사용

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V 
at org.apache.log4j.Category.differentiatedLog(Category.java:186) 
at org.apache.log4j.Category.info(Category.java:229) 

을 가지고있다

org.apache.storm:storm-core:jar:0.9.6:provided 
[INFO] +- org.clojure:clojure:jar:1.5.1:provided 
[INFO] +- clj-time:clj-time:jar:0.4.1:provided 
[INFO] +- joda-time:joda-time:jar:2.0:provided 
[INFO] +- compojure:compojure:jar:1.1.3:provided 
[INFO] +- org.clojure:core.incubator:jar:0.1.0:provided 
[INFO] +- org.clojure:tools.macro:jar:0.1.0:provided 
[INFO] +- clout:clout:jar:1.0.1:provided 
[INFO] +- ring:ring-core:jar:1.1.5:provided 
[INFO] +- commons-fileupload:commons-fileupload:jar:1.2.1:provided 
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided 
[INFO] +- hiccup:hiccup:jar:0.3.6:provided 
[INFO] +- ring:ring-devel:jar:0.3.11:provided 
[INFO] +- clj-stacktrace:clj-stacktrace:jar:0.2.2:provided 
[INFO] +- ring:ring-jetty-adapter:jar:0.3.11:provided 
[INFO] +- ring:ring-servlet:jar:0.3.11:provided 
[INFO] +- org.mortbay.jetty:jetty:jar:6.1.26:provided 
[INFO] +- org.mortbay.jetty:jetty-util:jar:6.1.26:provided 
[INFO] +- org.clojure:tools.logging:jar:0.2.3:provided 
[INFO] +- org.clojure:math.numeric-tower:jar:0.0.1:provided 
[INFO] +- org.clojure:tools.cli:jar:0.2.4:provided 
[INFO] +- commons-io:commons-io:jar:2.4:provided 
[INFO] +- org.apache.commons:commons-exec:jar:1.1:provided 
[INFO] +- commons-lang:commons-lang:jar:2.5:provided 
[INFO] +- com.googlecode.json-simple:json-simple:jar:1.1:provided 
[INFO] +- com.twitter:carbonite:jar:1.4.0:provided 
[INFO] +- com.esotericsoftware.kryo:kryo:jar:2.21:provided 
[INFO] +- 
    com.esotericsoftware.reflectasm:reflectasm:jar:shaded:1.07:provided 
[INFO] +- org.ow2.asm:asm:jar:4.0:provided 
[INFO] +- com.esotericsoftware.minlog:minlog:jar:1.2:provided 
[INFO] +- org.objenesis:objenesis:jar:1.2:provided 
[INFO] +- com.twitter:chill-java:jar:0.3.5:provided 
[INFO] +- org.yaml:snakeyaml:jar:1.11:provided 
[INFO] +- commons-logging:commons-logging:jar:1.1.3:provided 
[INFO] +- commons-codec:commons-codec:jar:1.6:provided 
[INFO] +- com.googlecode.disruptor:disruptor:jar:2.10.4:provided 
[INFO] +- org.jgrapht:jgrapht-core:jar:0.9.0:provided 
[INFO] +- ch.qos.logback:logback-classic:jar:1.0.13:provided 
[INFO] +- ch.qos.logback:logback-core:jar:1.0.13:provided 
[INFO] +- org.slf4j:slf4j-api:jar:1.7.5:provided 
[INFO] +- org.slf4j:log4j-over-slf4j:jar:1.6.6:provided 
[INFO] \- jline:jline:jar:2.11:provided 

내 POM

답변

2

편집 대답 난 당신이 classpathScope=compile로 프로그램을 시작으로이 제공 또는 컴파일 범위 종속성의 문제가 있음을 처음으로 의심 잘못

.

slf4 api를 찾았습니다. 그렇지 않으면 오류 메시지는 ClassNotFoundError이었습니다. (JavaDoc을 따라 버전 1.3 이후 거기에 있어요) 버전 1.7.5에서 SLF4J API의 정의

void log(Marker marker, String fqcn, int level, String message, Object[] argArray, Throwable t) 

가 :

문제는 log4j에 다음과 같은 메소드를 호출하고 싶어한다는 것입니다.

이 오류에 대한 유일한 설명은이 방법이 아직없고 LocationAwareLogger 인터페이스를로드 할 때 사용되는 클래스 경로에 다른 버전의 slf4j-api.jar가 있어야한다는 것입니다.

은 SLF4J-API의 다른 발생에 대한

mvn dependency:tree 

의 출력, 아마 트리 어딘가에 숨겨져을 확인하시기 바랍니다.

Class clazz = Class.forName("org.slf4j.spi.LocationAwareLogger"); 
    URL resourceUrl = clazz.getResource("/" + clazz.getCanonicalName().replace(".", "/") + ".class"); 
    System.out.println(resourceUrl.toString()); 

업데이트 : mvn exec으로 프로그램을 실행할 때

는 그래서 SLF4J가 다음 코드 (taking from this question)를 사용하는 것입니다에서

또 다른 가능성은 클래스가로드되는 경우 찾을 수 -api는 1.5.6 버전으로로드되었습니다 (Maven 의존성 hell에 오신 것을 환영합니다). 프로젝트의 전체 pom.xml을 표시 할 수 있습니까? 부모 pom이 있거나 그렇지 않으면 종속성이 도입 되었습니까? 명시 적으로 추가하여 SLF4J-API의 필요한 버전에 대한 종속성을 추가하면 어떻게됩니까 :

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.9</version> 
</dependency> 

업데이트 :이 문제는 간부-받는다는 - 플러그인에서 제공

, 이것은 기존의로드 slf4j-api 버전.플러그인 구성에서 다음 줄을 제거하면 :

<includePluginDependencies>true</includePluginDependencies> 

실제 slf4j-api가로드됩니다. 값을 false으로 설정할 수도 있지만 그 값은 기본값입니다. 프로젝트의 패키지를 빌드 할 때 플러그인 종속성을 포함시켜야한다고 생각하지 않습니다. 이 매개 변수에 대한 설명은 다음과 같습니다.

Indicates if this plugin's dependencies should be used when executing the main class. This is useful when project dependencies are not appropriate. Using only the plugin dependencies can be particularly useful when the project is not a java project. For example a mvn project using the csharp plugins only expects to see dotnet libraries as dependencies.

이 줄을 제거하거나 값을 false로 설정하면 문제가 해결 될 것이라고 생각합니다.

+0

답장을 보내 주셔서 감사합니다.하지만 pom에는 slf4j에 대한 내용이 없습니다. 그래서 나는 그것을 제공하는 것을 정의하지 않았다. 어떻게 확인할 수 있습니까? – user5520049

+0

폭풍우에 의해 일시적으로 필요하므로 런타임 환경에 클래스 경로에 이러한 라이브러리가 있는지 확인해야합니다. 의존성은 어떻게 정의됩니까? –

+0

실례지만 폭풍에있는 도서관 폴더를 확인해야합니까? 나는 그것을 검사하고 slf4j에 대한 두 개의 파일을 발견 했으므로 제거했습니다. 하지만 그 파일은 m2/repository/org에 있습니다. 그 후에 내가 무엇을해야합니까? 나는 질문 게시판에 내 POM을 게시합니다. 양해 해 주셔서 감사합니다 – user5520049