2016-05-04 4 views
1

У меня проблема с конфликтующими зависимостями в моем проекте. В частности, есть две реализации SLF4J лесозаготовок: SLF4J-простой и Logback-классика, и я получаюИсключение зависимостей в 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) 

во время выполнения.

logback-classic - обязательная зависимость для меня (из-за dropwizard), но slf4j-simple на самом деле не так, и я хотел бы отказаться от него из моего проекта uber. Только это не так просто.

Мой «uber jar» имеет зависимость от «маленькой банки», которая, в свою очередь, имеет зависимость от «slf4j-simple». Положив исключение в П Uber Jar является не помогаешь:

<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> 

Я думаю, потому что малая баночка «затененная». Мой «uber-jar» использует maven-shade-plugin, а «small-jar» - нет. Я также попытался исключить SLF4J простое затенение:

<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> 

но без успеха. slf4j-simple все еще включен в мою uber-jar. До сих пор мое развитие было связано с «uber-jar». Возможно внесение изменений в код «маленькой банки», но я бы хотел этого избежать.

Что я делаю неправильно?

+0

Обновление: maven-shade-plugin здесь не является преступником. Я полностью отключил этот плагин и по-прежнему получал точно такую ​​же ошибку. – Alexander

+0

Обновление 2: По-видимому, мои проблемы были вызваны неправильной конфигурацией проекта. После очистки всего (включая репозиторий maven), проверки свежих источников и создания проекта в Eclipse с нуля, все работает должным образом. Спасибо всем. – Alexander

ответ

0

Имейте в виду, что вы имеете в виду «uber-jar». родительский проект ?!

каким-либо образом использовать mvn dependency:tree -Dincludes=:slf4j*, чтобы увидеть, где он приходит, а затем определить зависимость в нижней проекта и исключить переходные, как вы сделали выше

надеюсь, что это помогает

+0

Спасибо, Хишам. Под «uber-jar» я имею в виду моего хозяина, проект высшего уровня. Curiousli, slf4j-simple не находится в дереве зависимостей maven, но так или иначе попадает в мастер-банку. – Alexander

0

Почему малые банки затемнены ? Кажется, вы могли бы просто позволить maven обрабатывать транзитивную зависимость slf4j при компиляции small-jar в качестве не затененного артефакта, а затем, когда вы зависите от маленькой банки в своем «uber-jar», исключите необходимые транзитивные зависимости (которые будет slf4j). Как только его затушевывает, maven не сможет исключить зависимости, поскольку для всего, что он знает, все в маленькой банке - это единственная зависимость.

Я вижу, что вы хотите избежать внесения изменений в мелкую банку, но это одна из неотъемлемых проблем с затенением в целом. Я бы рекомендовал либо не затенять мелкую банку вообще, либо, по крайней мере, исключить slf4j из затенения мелкой банки и позволить maven обрабатывать его как обычную транзитивную зависимость, которая может быть исключена в конфигурации зависимостей uber-jar.

+0

До сих пор (согласно сообщениям maven's build) я смог исключить мелкую банку из затенения. Однако это не остановило uber-jar от вытаскивания slf4j-простого, хотя оно явно указано как исключение зависимостей. – Alexander

+0

Является ли маленькая банка единственной бабкой uber зависимости? Возможно, другая зависимость приносит его, и вам нужно глобально исключить его. – alexanderific