2017-02-10 10 views
0

우리는 스톰 1.0.1 및 탄성 검색 5.2가있는 gradle에서 sl4j 버전 충돌에 직면하고 있습니다.sl4j 버전이 스톰 1.0.1 및 elasticsearch 5.2와 충돌합니다.

우리는 ElasticSearch가 원하는 로거를 사용할 수 있도록 log4j-to-slf4j 브릿지가 필요하다는 것을 발견했습니다. 여기서 우리는 logback-classic을 slf4j와 함께 사용하려고합니다. 토폴로지 때

configurations.all { 
    resolutionStrategy { 
     eachDependency { DependencyResolveDetails dependencyResolveDetails -> 
      final requestedDependency = dependencyResolveDetails.requested 
      if (requestedDependency.group == 'org.slf4j' && requestedDependency.name == 'slf4j-api') { 
       requestedDependency.setVersion "1.7.7" 
      } 
     } 
    } 
} 

을하지만 :

dependencies { 
    compile 'org.slf4j:slf4j-api:1.7.21' 
    compile 'org.apache.logging.log4j:log4j-to-slf4j:2.6.2' 
    compile 'ch.qos.logback:logback-classic:1.1.10' 
    provided ('org.apache.storm:storm-core:1.0.1') { 
     exclude(group: 'org.slf4j', module: 'slf4j-api') 
    } 
    compile 'org.elasticsearch:elasticsearch:5.2.0' 
    compile 'org.elasticsearch.client:x-pack-transport:5.2.0' 
} 

내가 폭풍 코어에서 SLF4J를 제외하는 노력이 문제를 해결하고 나중에 아래와 같은를 추가하려면 :

종속성

은 다음과 같이 정의된다 우리는 오류 메시지를 받았습니다. SLF4J : 클래스 경로에 여러 개의 SLF4J 바인딩이 있습니다. SLF4J : [jar : file : /Users/gauthamr05/Documents/Apps/Storm/apache-storm-1.0.1/lib/log4j-slf4j-impl-2.1.jar!/org/slf4j/impl/StaticLoggerBinder에서 바인딩을 찾을 수 없습니다. .class] SLF4J : [jar : file : /Users/gauthamr05/Documents/workspace/xyz_app/build/libs/FullIndexing.jar !/org/slf4j/impl/StaticLoggerBinder.class]에서 바인딩을 찾았습니다. SLF4J : http://www.slf4j.org/codes.html#multiple_bindings을 참조하십시오. 설명. SLF4J : 실제 바인딩 유형은 [org.apache.logging.slf4j.Log4jLoggerFactory] 스레드 "main"의 예외 java.lang.StackOverflowError at org.apache.logging.log4j.spi.LoggerRegistry.getOrCreateInnerMap (LoggerRegistry.java : 140) at org.apache.logging.log4j.spi.LoggerRegistry.hasLogger (LoggerRegistry.java:154) at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger (SLF4JLoggerContext.java:38) at org.apache .logging.slf4j.Log4jLoggerFactory.newLogger (Log4jLoggerFactory.java:37) at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger (Log4jLoggerFactory.java:29) at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger (AbstractLoggerAdapter.java:47) at org.apache.logging.slf4j.Log4jLogg erFactory.getLogger (Log4jLoggerFactory.java:29) org.slf4j.LoggerFactory.getLogger (LoggerFactory.java:277)에서 예외 상태로

답변

0

, StaticLoggerBinder.class 함유 두 병이있다.

  • /Users/gauthamr05/Documents/Apps/Storm/apache-storm-1.0.1/lib/log4j-slf4j-impl-2.1.jar
  • /사용자/gauthamr05/문서/작업/xyz_app/빌드/libs/FullIndexing.jar

질문 : xyz_app/build/libs/FullIndexing.jar은 (는) 자신의 프로젝트 중 하나입니다.

자신의 항아리 인 경우 여기서 약간 추측하고 있지만 org/slf4j/impl/StaticLoggerBinder.java은 클래스 경로의 항아리 중 하나에 포장되어 있다고 생각합니다. 너의 classpath에있는 jars에있는 파일 들인 .java을 컴파일하는 wierd default가 javac입니다. 이 참조

compileJava.options.compilerArgs << '-implicit:none' 

에 의해 꺼 최종 항아리에서 log4j에 클래스를 그림자 할 수있는 방법을 herehere

0

발견 할 수있다.

apply plugin: 'com.github.johnrengelman.shadow' 

subprojects { 
    shadowJar 
} 

dependencies { 
    compile 'org.slf4j:slf4j-api:1.7.22' 
    compile 'ch.qos.logback:logback-classic:1.1.10' 

    compileOnly("org.apache.storm:storm-core:1.0.1") { 
     exclude module: "log4j-slf4j-impl" 
     exclude module: "slf4j-api" 
     exclude module: "log4j-to-slf4j" 
    } 

    // ElasticSearch and X-Pack 
    compile 'org.elasticsearch:elasticsearch:5.2.0' 
    compile 'org.elasticsearch.client:x-pack-transport:5.2.0' 

    compile 'org.apache.logging.log4j:log4j-api:2.7' 
    compile 'org.apache.logging.log4j:log4j-core:2.7' 
} 

shadowJar { 
    relocate 'org.apache.logging.log4j', 'gautham.elasticsearch.org.apache.logging.log4j' 

    zip64 true 
    transform(ServiceFileTransformer) { 
     path = 'META-INF/vesta*' 
    } 

    manifest { 
     attributes 'Implementation-Title': 'Storm Topology', 
      'Implementation-Version': 1.0, 
      'Main-Class': 'com.gautham.topology.StormTopology' 
    } 

    baseName = 'StormTopology' 

    mergeServiceFiles() 

    exclude "META-INF/*.SF" 
    exclude 'META-INF/*.DSA' 
    exclude 'META-INF/*.RSA' 
    exclude "LICENSE*" 
} 
: 다음

구성입니다