Сборка Maven [ВНИМАНИЕ] у нас есть повторяющийся класс

Кто-нибудь знает, что случилось с моей сборкой maven? Я получаю много повторяющихся предупреждений.

[WARNING] We have a duplicate org/apache/commons/logging/impl/LogFactoryImpl$1.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/LogFactoryImpl.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/NoOpLog.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/SimpleLog$1.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/SimpleLog.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/Jdk14Logger.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar

Я заглянул в свое локальное репо m2, у меня там два класса в банке commons-logging-api, LogFactoryImpl.class и LogFactoryImpl $ 1.class. То же, что и все классы, упомянутые в предупреждениях.

Следует упомянуть, что я использую плагин тени в моем pom.xml.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <configuration>
                <createDependencyReducedPom>true</createDependencyReducedPom>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.~~~~black out my own main class here~~~~~</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Я заметил, что дерево зависимостей выглядит так, как показано ниже

[INFO] +- org.apache.cxf:cxf-bundle-jaxrs:jar:2.5.1:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] \- org.apache.hadoop.hive:hive-jdbc:jar:0.7.1-cdh3u3:compile
[INFO]    \- org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile
[INFO]       \- commons-logging:commons-logging-api:jar:1.0.4:compile

и commons-logging.jar, и commons-logging-api.jar имеют org / apache / commons / logging / LogFactory.class.

каким-то образом плагин Shad пытается втиснуть их в большую толстую банку в конце. затем появляется предупреждение. Было сказано, что это игнорируемое предупреждение. Но меня немного беспокоит, как приложение узнает, какой именно класс следует использовать, если есть два дублированных класса с одинаковым именем?


person Shengjie    schedule 21.03.2012    source источник
comment
LogFactoryImpl.class и LogFactoryImpl $ 1.class класс с $ 1 в имени является локальным классом внутри LogFactoryImpl.   -  person khmarbaise    schedule 21.03.2012


Ответы (8)


Взгляните на раздел «Исключения зависимостей» в Документ Maven.

В предоставленном вами примере я исключу зависимость commons-logging:commons-logging-api:jar:1.0.4:compile от org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile. В вашем pom.xml:

    <dependency>
        <groupId>org.apache.hadoop.hive</groupId>
        <artifactId>hive-common:jar</artifactId>
        <version>0.7.1-cdh3u3</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
person ndeverge    schedule 21.03.2012
comment
Большое спасибо, это имеет смысл. Итак, как лучше всего управлять такими зависимостями. скажем, у вас есть projectA.jar, projectB.jar, у них одинаковые зависимости в разных версиях. например. зависимость 1.0, зависимость 2.0. Использование одного из них сопряжено с риском. Есть ли способ позволить ProjectA продолжать использовать depdency.1.0, в то время как ProjectB все еще использует dependency.2.0? - person Shengjie; 22.03.2012
comment
Нет, нет (возможно, с OSGI, но я не эксперт в этой области). В этом случае загрузчик классов выбирает класс для использования (в зависимости от ОС, JVM и т. Д., Часто это первый jar, на который ссылаются в пути к классам). Лучше всего взять последнюю версию (исключить другие версии), надеясь, что она обратно совместима ... Но это лучше, чем позволить загрузчику классов выбирать за вас. - person ndeverge; 22.03.2012

Вы также могли столкнуться с ограничением maven-shader-plugin. Он заменяет артефакт jar по умолчанию (созданный maven-jar-plugin). Это отлично работает с чистой сборкой, но при перестроении, когда jar не регенерируется, шейдер снова запускается на jar, созданном в прошлый раз, который уже содержит копии всех зависимостей классов. Это вызывает множество предупреждений о дубликатах.

Эта проблема все еще не решена в maven-shader-plugin 2.0: https://issues.apache.org/jira/browse/MSHADE-126

Один из способов обхода - явно добавить maven-jar-plugin в ваш pom.xml и добавить параметр конфигурации <forceCreation>true</forceCreation>.

person user1454388    schedule 02.04.2013
comment
Это то, что вызвало это для меня. Вы можете решить эту проблему, следуя приведенному здесь решению: stackoverflow.com/questions/8880361/ - person stantonk; 28.08.2013

В моем случае мой родительский pom включал commons-beanutils, а мой дочерний модуль (это единственное, что я хотел скомпилировать) включал commons-io.

Плагин Shade жаловался на дубликаты, поскольку commons-io и commons-beansutil разделяли некоторые общие классы. Обратите внимание, что beansutiul был включен, хотя он не нужен, и не использовался.

Я решаю эту проблему, минимизируя банку, добавляя это в конфигурацию:

<minimizeJar>true</minimizeJar>

Теперь плагин тени не добавлял неиспользуемые ресурсы.

Предупреждение ушло.

person Somaiah Kumbera    schedule 02.10.2013

Все вышеизложенное (о просмотре дерева зависимостей и исключении) в большинстве случаев является правильным, но в моем случае (у меня не было перекрытия в моих зависимостях) предварительный clean помог (хотя не знаю почему):

mvn clean package

person radistao    schedule 06.03.2017

Вы можете исключить ненужную банку (те, которые выдают повторяющиеся предупреждения, используя следующие теги под плагином тени:

    <configuration>
    <artifactSet>
      <excludes>
        <exclude>commons-logging:commons-logging</exclude>
      </excludes>
    </artifactSet>
    <minimizeJar>true</minimizeJar>
    </configuration>

Более подробную информацию можно найти на http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html

person Suman    schedule 03.12.2013

Я видел это в eclipse, когда обновлял зависимости своего родительского проекта.

Я удалил все файлы в моем целевом каталоге, и это устранило проблемы.

person Ben    schedule 09.12.2014

В моем случае я полагался на пакет, который также создает затемненную банку.

Затененные jar-файлы предназначены для развертывания, а не для установки в качестве зависимости.

Создание POM с уменьшенной зависимостью во время процесса сборки зависимости указывает maven, какие зависимости могут быть исключены.

В конфигурации maven-shade-plugin:

<configuration>
  <createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>

Для получения дополнительной информации см. Этот пост:

Для чего используется maven-shade-plugin и почему вы хотите перемещать пакеты Java?

Ошибка, которую я получал от maven:

ВНИМАНИЕ: x.jar, y.jar содержат перекрывающиеся классы

person comfytoday    schedule 07.02.2018

У вас есть зависимости в вашем pom, которые содержат повторяющиеся классы, но без соответствующего pom я не мог бы сказать об этом ни слова.

person khmarbaise    schedule 21.03.2012
comment
добавили дополнительную информацию, можете ли вы взглянуть на нее еще раз? Спасибо - person Shengjie; 21.03.2012
comment
Вы проверили, какая из зависимостей содержит повторяющиеся классы? Основываясь на вашем выводе, commons-logging-api-1.0.4.jar, который, похоже, исходит из использования другой версии api (дублирован) или вы используете другого поставщика журналов (slf4j?). - person khmarbaise; 21.03.2012