我们在使用 Storm 1.0.1 和 elasticsearch 5.2 的 gradle 中面临 sl4j 版本冲突。
我们发现 ElasticSearch 需要桥接 log4j-to-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'
}
为了解决这个问题,我尝试从 Storm-core 中排除 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"
}
}
}
}
但是当拓扑提交时,我们得到错误: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 中找到绑定。类] 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] org.apache.logging.log4j.spi.LoggerRegistry.getOrCreateInnerMap(LoggerRegistry.java:140) 处的线程“main”java.lang.StackOverflowError 异常在 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.slf4j 中的 org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)。