2016-05-04 20 views
1

Ich habe ein Problem mit widersprüchlichen Abhängigkeiten in meinem Projekt. Insbesondere gibt es zwei Implementierungen von slf4j Protokollierung: slf4j-einfacher und logback-klassisch, und ich binOhne Abhängigkeit in maven

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/Users/apykhtin/.m2/repository/org/slf4j/slf4j-simple/1.7.19/slf4j-simple-1.7.19.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [jar:file:/Users/apykhtin/.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.slf4j.impl.SimpleLoggerFactory] 
Exception in thread "main" java.lang.IllegalStateException: Unable to acquire the logger context 
     at io.dropwizard.logging.LoggingUtil.getLoggerContext(LoggingUtil.java:46) 

zur Laufzeit zu bekommen.

Logback-Klassiker ist ein Muss-Abhängigkeit für mich (wegen Dropwizard), aber Slf4j-einfach ist nicht wirklich, und ich möchte es aus meinem Uber-Projekt fallen lassen. Nur ist es nicht so einfach.

Mein "Uber-Jar" hat eine Abhängigkeit von "Small-Jar", die wiederum eine Abhängigkeit von "Slf4j-Simple" hat. einen Ausschluss Putting in pom uber Glas ist ist nicht zu helfen:

<dependency> 
    <groupId>com.my.unique.group</groupId> 
    <artifactId>small-jar</artifactId> 
    <version>0.1.2-SNAPSHOT</version> 
    <exclusions> 
     <exclusion> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-simple</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

Ich denke, weil kleine jar "beschattet" wird. Mein "Uber-Jar" verwendet Maven-Shade-Plugin, während "Small-Jar" nicht ist. Ich habe auch versucht slf4j-einfach aus Schattierung auszuschließen:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>1.6</version> 
    <configuration> 
    <artifactSet> 
     <excludes> 
      <exclude>org.slf4j:slf4j-simple:jar</exclude> 
     </excludes> 
    </artifactSet> 
    ... 
</plugin> 

aber auch ohne Erfolg. slf4j-simple wird immer noch in meinem Uber-Jar enthalten. Bisher war meine Entwicklung mit "Uber-Jar" verwandt. Es ist mir möglich, Änderungen am "Small-Jar" -Code vorzunehmen, aber das möchte ich vermeiden.

Was mache ich falsch?

+0

Update: maven-shade-plugin ist nicht der Schuldige hier. Ich habe dieses Plugin komplett ausgeschaltet und bekomme immer noch den gleichen Fehler. – Alexander

+0

Update 2: Offensichtlich wurden meine Probleme durch Projektfehlkonfiguration verursacht. Nach dem Löschen von allem (einschließlich Maven-Repository), Auschecken neuer Quellen und Erstellen von Projekten in Eclipse von Grund auf, alles funktioniert wie erwartet. Dank euch allen. – Alexander

Antwort

0

ich bin nicht sicher, was Sie mit "Uber-Jar" meinen. Elternprojekt ?!

eine Möglichkeit Gebrauch mvn dependency:tree -Dincludes=:slf4j* zu sehen, woher es kommt, dann die Abhängigkeit im unteren Projekt definieren und die transitiven ausschließen, wie Sie oben

Hoffnung gemacht haben, das hilft

+0

Danke, Hisham. Mit "Uber-Jar" meine ich mein Master, Top-Level-Projekt. Curiousli, slf4j-simple ist nicht im maven dependency tree, aber irgendwie kommt es irgendwie in den master jar. – Alexander

0

Warum Klein jar schattiert wird ? Es scheint, als könnten Sie einfach maven die transitive Abhängigkeit von slf4j behandeln lassen, wenn Sie Small-Jar als nicht schattiertes Artefakt kompilieren, und dann, wenn Sie von einem kleinen Jar in Ihrem "Uber-Jar" abhängig sind, die notwendigen transitiven Abhängigkeiten ausschließen wäre slf4j). Sobald es schattiert ist, wird Maven die Abhängigkeiten nicht ausschließen können, denn alles, was es weiß, ist alles in Small-Jar eine einzige Abhängigkeit.

Ich sehe Sie wollen vermeiden, Änderungen an Small-Jar, aber das ist eines der inhärenten Probleme mit Schattierung im Allgemeinen. Ich würde empfehlen, Small-Jar überhaupt nicht zu schattieren oder zumindest slf4j von der Small-Jar-Schattierung auszuschließen und es als normale transitive Abhängigkeit behandeln zu lassen, die in der Abhängigkeitskonfiguration Ihres Uber-Jar ausgeschlossen werden kann.

+0

Bis jetzt (gemäß den Build-Nachrichten von Maven) konnte ich Small-Jar von der Schattierung ausschließen. Dies hat jedoch nicht verhindert, dass sich uber-jar slf4j-simple zuzog, obwohl es explizit als Abhängigkeitsausschluss aufgeführt ist. – Alexander

+0

Ist das kleine Glas die einzige Abhängigkeit, die das Glas hat? Es ist möglich, dass eine andere Abhängigkeit es einbringt, und Sie müssen es global ausschließen. – alexanderific