elasticsearch-5,Gradle,Apache Storm,Slf4j,elasticsearch 5" /> elasticsearch-5,Gradle,Apache Storm,Slf4j,elasticsearch 5" />

sl4j版本在gradle中与Storm 1.0.1和elasticsearch 5.2冲突

sl4j版本在gradle中与Storm 1.0.1和elasticsearch 5.2冲突,gradle,apache-storm,slf4j,elasticsearch-5,Gradle,Apache Storm,Slf4j,elasticsearch 5,我们在gradle面临sl4j版本与Storm 1.0.1和elasticsearch 5.2的冲突 我们发现ElasticSearch需要桥接log4j到slf4j,以便使用所需的记录器。 这里我们尝试将logback classic与slf4j一起使用 依赖项定义如下: dependencies { compile 'org.slf4j:slf4j-api:1.7.21' compile 'org.apache.logging.log4j:log4j-to-slf4j:2.6

我们在gradle面临sl4j版本与Storm 1.0.1和elasticsearch 5.2的冲突

我们发现ElasticSearch需要桥接log4j到slf4j,以便使用所需的记录器。 这里我们尝试将logback classic与slf4j一起使用

依赖项定义如下:

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'
}
configurations.all {
    resolutionStrategy {
        eachDependency { DependencyResolveDetails dependencyResolveDetails ->
            final requestedDependency = dependencyResolveDetails.requested
            if (requestedDependency.group == 'org.slf4j' && requestedDependency.name == 'slf4j-api') {
                requestedDependency.setVersion "1.7.7"
            }
         }
    }
}
为了解决这个问题,我尝试从storm core中排除slf4j,并在稍后添加相同的slf4j,如下所示:

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'
}
configurations.all {
    resolutionStrategy {
        eachDependency { DependencyResolveDetails dependencyResolveDetails ->
            final requestedDependency = dependencyResolveDetails.requested
            if (requestedDependency.group == 'org.slf4j' && requestedDependency.name == 'slf4j-api') {
                requestedDependency.setVersion "1.7.7"
            }
         }
    }
}
但当提交拓扑时,我们会得到错误: 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/fullindex.jar!/org/SLF4J/impl/StaticLoggerBinder.class]中找到绑定 SLF4J:有关说明,请参阅。 SLF4J:实际绑定的类型为[org.apache.logging.SLF4J.Log4jLoggerFactory] 线程“main”java.lang.StackOverflowerr中出现异常 位于org.apache.logging.log4j.spi.LoggerRegistry.getOrCreateInnerMap(LoggerRegistry.java:140) 位于org.apache.logging.log4j.spi.LoggerRegistry.hasLogger(LoggerRegistry.java:154) 位于org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:38) 位于org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37) 位于org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29) 位于org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47) 位于org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
在org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:277)

作为例外状态,有两个jar包含
StaticLoggerBinder.class

  • /Users/gauthamr05/Documents/Apps/Storm/apache-Storm-1.0.1/lib/log4j-slf4j-impl-2.1.jar
  • /Users/gauthamr05/Documents/workspace/xyz_app/build/libs/fullindex.jar
问题:
xyz_app/build/libs/fullindex.jar
是您自己的项目之一吗

如果它是您自己的jar,我在这里有点猜测,但是我猜测
org/slf4j/impl/StaticLoggerBinder.java
被打包在您的类路径上的一个jar中。有一个wierd默认值
javac
,它将编译在类路径的jar中找到的任何
.java
文件。这可以通过以下方式关闭:

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

compileJava.options.compilerArgs找到了一种在最终jar中隐藏log4j类的方法

以下是配置:

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*"
}