I am having several issues due to the slf4j implementation dependency 
“log4j-slf4j-impl” being declared as a dependency of solr-core:7.5.0.   The 
first issue observed when starting the app is this:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in 
[jar:file:/Users/ma-wolf2/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.7/log4j-slf4j-impl-2.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in 
[jar:file:/Users/ma-wolf2/.m2/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]

I first got wind that this might not be just myself from this thread:
https://lucene.472066.n3.nabble.com/log4j-slf4j-impl-dependency-in-solr-core-td4449635.html#a4449891


  *   If there are any users that integrate solr-core into their own code,
it's currently a bit of a land-mine situation to change logging
implementations.  If there's a way we can include log4j jars at build
time, but remove the log4j dependency on the published solr-core
artifact, that might work well.  We should do our best to make it so
people can use EmbeddedSolrServer without log4j jars.

There are two dimensions to this dependency problem:

  *   Building a war file (this runs with a warning)
  *   Building a spring-boot executable JAR with embedded servlet container 
(doesn’t run)

When building a WAR and deploying, I get the “multiple SLF4J bindings” warning, 
but the app works. However, I want the convenience of a spring-boot executable 
JAR with embedded servlet container, but in that case, I get that warning 
followed by a fatal NoClassDefFoundError/ ClassNotFoundException – which is a 
show-stopper.  If I hack the built spring-boot FAT jar and remove 
“log4j-slf4j-impl.jar” then the app works.

For the WAR build, the proper version of log4j-slf4j-impl.jar was included – 
2.11.0, but,for some reason when building the spring-boot fat (uber) jar, it 
was building with log4j-slf4j-impl:2.7 so of course it will croak.

There are several issues:

  1.  I don’t want log4j-slf4j-impl at all
  2.  Somehow the version of “log4j-slf4j-impl” being used for the build is 2.7 
rather then the expected 2.11.0
  3.  Due to the version issue, the app croaks with ClassNotFoundException: 
org.apache.logging.log4j.util.ReflectionUtil

For issue #1, I tried:
  <dependency>
      <groupId>org.apache.solr</groupId>
      <artifactId>solr-core</artifactId>
      <version>7.5.0</version>
      <exclusions>
        <exclusion>
          <artifactId>org.apache.logging.log4j</artifactId>
          <groupId>log4j-slf4j-impl</groupId>
        </exclusion>
      </exclusions>
    </dependency>

All to no avail, as that dependency ends up in the packaged build - for WAR, 
it’s version 2.11.0, so even though it’s a bad build, the app runs, but for 
building a spring-boot executable JAR with embedded webserver, for some reason, 
it switches log4j-slf4j-impl from version 2.11.0  to 2,7 (2.11.0  works, but 
should not even be there)

I also tried this:
https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/exclude-dependency.html

…that didn’t work either.

I’m thinking that solr-core should have added a classifier of “provided” for 
“log4j-slf4j-impl”, but that’s conjecture of a possible solution going forward, 
but does anyone know how I can exclude  “log4j-slf4j-impl”  from a spring-boot 
build?





Reply via email to