2016-02-10 3 views
4

Я использую maven-shade-plugin для создания исполняемого банку, который содержит все зависимости моего проекта. Иногда эти зависимости приводят к собственным зависимостям, которые сталкиваются с зависимостями других библиотек, а плагин maven-shade предупреждает меня, что он не уверен, какую версию включить в банку uber.Что мне делать с конфликтами зависимостей при использовании плагина maven-shade?

[WARNING] maven-shade-plugin has detected that some .class files 
[WARNING] are present in two or more JARs. When this happens, only 
[WARNING] one single version of the class is copied in the uberjar. 
[WARNING] Usually this is not harmful and you can skeep these 
[WARNING] warnings, otherwise try to manually exclude artifacts 
[WARNING] based on mvn dependency:tree -Ddetail=true and the above 
[WARNING] output 

В общем, мой ответ на это предупреждение, чтобы использовать <exclusions> элемент декларации в зависимости в моем файле пом, чтобы удалить зависимости обижая из моего проекта:

<!-- Amazon ElastiCache Client --> 
<dependency> 
    <groupId>com.amazonaws</groupId> 
    <artifactId>elasticache-java-cluster-client</artifactId> 
    <version>1.0.61.0</version> 
    <exclusions> 
     <!-- this junit dependency clashes with our test-scoped one and causes integration tests to fail to run --> 
     <exclusion> 
      <groupId>junit</groupId> 
      <artifactId>junit-dep</artifactId> 
     </exclusion> 
     <!-- this dependency brings in two versions of cglib that clash with one another --> 
     <exclusion> 
      <groupId>jmock</groupId> 
      <artifactId>jmock-cglib</artifactId> 
     </exclusion> 
     <!-- newer versions of these dependencies come with dropwizard-core --> 
     <exclusion> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
     </exclusion> 
     </exclusions> 
</dependency> 

Когда я делаю это, Я использую mvn dependency:tree, чтобы удостовериться, что я исключаю нижнюю версию оскорбительной зависимости, в надежде, что самая новая версия является самой зрелой и без ошибок.

Случаи, как один выше, что в конечном итоге с большим количеством исключений поднять два вопроса об этой практике:

  1. В приведенном выше примере, почему я должен вручную исключить JUnit и JMock? Обе эти зависимости отмечены как <scope>test</scope> в the elasticache-java-cluster-client pom.xml, поэтому я ожидаю, что они не будут включены в банку, которую я получаю от maven.
  2. Хотя моя практика всегда принимать более новую версию зависимости, похоже, до сих пор работает, я боюсь, что на днях я что-то сломаю. Есть ли лучший способ определить, какую версию зависимости сохранить?
+0

Привет, вы можете указать, какую версию плагина вы используете. В общем случае он не будет добавлять библиотеки, помеченные тестом области. Есть ли какой-нибудь случай, когда некоторые из них не помечены как тестеры в вашем помпе? Механизм исключения в секции зависимостей работает для реактора Maven, который решает ваши зависимости, а не плагин. Поэтому, определяя исключения в зависимости, вы просто указываете Maven, какую зависимость учитывать, а какие нет. С другой стороны, если вы хотите контролировать (фильтровать) зависимости и инклюзивы плагина тени, вам необходимо предоставить конфигурацию на плагине. – javapapo

+0

См. [Здесь] (https://maven.apache.org/plugins/maven-shade -plugin/examples/includes-excludes.html #) для конфигурации плагина оттенка – javapapo

+0

Я использую версию 2.3 плагина maven-shade. Я знаком с конфигурацией плагинов maven-shade и уже настроил его, как рекомендовано на странице, которую вы связали. Мой вопрос касается тактики, которую люди обычно принимают при выборе исключений для добавления, а не о том, как добавить исключения в первую очередь. – MusikPolice

ответ

2

Вы пробовали добавить maven-enforcer-plugin с DependencyConvergence rule? Это хорошо сработало для меня в сочетании с плагином. Он расскажет вам, какие артефакты приносят разные версии одних и тех же классов. Это позволило мне выяснить, что я должен исключить.

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-enforcer-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>enforce</id> 
        <configuration> 
         <rules> 
          <DependencyConvergence/> 
         </rules> 
        </configuration> 
        <goals> 
         <goal>enforce</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+0

Твердое предложение, но оно может быть слишком строгим для реального мира. Например, мой проект зависит от 'ru.vyarus: dropwizard-guicey: 3.1.1', который, в свою очередь, имеет ошибку конвергенции конвергенции - одна из его зависимостей, в свою очередь, зависит от' com.google.inject: guice: 3.0', а два других зависят от 'com.google.inject: guice: 4.0'. Исключения Maven не позволяют мне указать, какую версию включить, поэтому я не знаю, как решить эту проблему. – MusikPolice

Смежные вопросы