Библиотека Kryo имеет предупреждение о перекрывающихся классах на этапе maven shadow-package

Я пытаюсь создать затененный файл jar, но плагин затенения выдает мне предупреждения. Я не уверен, как их исправить.

Вот мой пом.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>example.shade.group</groupId>
    <artifactId>myproj-shade-kryo</artifactId>
    <name>myproj-shade-kryo</name>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.esotericsoftware.kryo</groupId>
            <artifactId>kryo</artifactId>
            <version>2.21</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <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>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.2</version>
                <executions>
                    <execution>
                        <id>package</id>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

И предупреждение такое:

[INFO] --- maven-shade-plugin:2.4.2:shade (package) @ myproj-shade-kryo ---
[INFO] Including com.esotericsoftware.kryo:kryo:jar:2.21 in the shaded jar.
[INFO] Including com.esotericsoftware.reflectasm:reflectasm:jar:shaded:1.07 in the shaded jar.
[INFO] Including org.ow2.asm:asm:jar:4.0 in the shaded jar.
[INFO] Including com.esotericsoftware.minlog:minlog:jar:1.2 in the shaded jar.
[INFO] Including org.objenesis:objenesis:jar:1.2 in the shaded jar.
[WARNING] minlog-1.2.jar, kryo-2.21.jar define 2 overlapping classes: 
[WARNING]   - com.esotericsoftware.minlog.Log
[WARNING]   - com.esotericsoftware.minlog.Log$Logger
[WARNING] reflectasm-1.07-shaded.jar, kryo-2.21.jar define 23 overlapping classes: 
[WARNING]   - com.esotericsoftware.reflectasm.shaded.org.objectweb.asm.Opcodes
[WARNING]   - com.esotericsoftware.reflectasm.AccessClassLoader
[WARNING]   - com.esotericsoftware.reflectasm.shaded.org.objectweb.asm.Label
[WARNING]   - com.esotericsoftware.reflectasm.shaded.org.objectweb.asm.ClassWriter
[WARNING]   - com.esotericsoftware.reflectasm.shaded.org.objectweb.asm.AnnotationVisitor
[WARNING]   - com.esotericsoftware.reflectasm.shaded.org.objectweb.asm.Type
[WARNING]   - com.esotericsoftware.reflectasm.FieldAccess
[WARNING]   - com.esotericsoftware.reflectasm.ConstructorAccess
[WARNING]   - com.esotericsoftware.reflectasm.shaded.org.objectweb.asm.ClassVisitor
[WARNING]   - com.esotericsoftware.reflectasm.shaded.org.objectweb.asm.Edge
[WARNING]   - 13 more...
[WARNING] objenesis-1.2.jar, kryo-2.21.jar define 32 overlapping classes: 
[WARNING]   - org.objenesis.ObjenesisBase
[WARNING]   - org.objenesis.instantiator.gcj.GCJInstantiator
[WARNING]   - org.objenesis.ObjenesisHelper
[WARNING]   - org.objenesis.instantiator.jrockit.JRockitLegacyInstantiator
[WARNING]   - org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator
[WARNING]   - org.objenesis.instantiator.ObjectInstantiator
[WARNING]   - org.objenesis.instantiator.gcj.GCJInstantiatorBase$DummyStream
[WARNING]   - org.objenesis.instantiator.basic.ObjectStreamClassInstantiator
[WARNING]   - org.objenesis.ObjenesisException
[WARNING]   - org.objenesis.Objenesis
[WARNING]   - 22 more...
[WARNING] maven-shade-plugin has detected that some class files are
[WARNING] present in two or more JARs. When this happens, only one
[WARNING] single version of the class is copied to the uber jar.
[WARNING] Usually this is not harmful and you can skip these warnings,
[WARNING] otherwise try to manually exclude artifacts based on
[WARNING] mvn dependency:tree -Ddetail=true and the above output.
[WARNING] See http://maven.apache.org/plugins/maven-shade-plugin/

Я тоже попробовал mvn dependency:tree -Ddetail=true, но это не дает мне никаких подсказок, как исправить:

[INFO] ------------------------------------------------------------------------
[INFO] Building myproj-shade-kryo 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ myproj-shade-kryo ---
[INFO] example.shade.group:myproj-shade-kryo:jar:1.0.0-SNAPSHOT
[INFO] \- com.esotericsoftware.kryo:kryo:jar:2.21:compile
[INFO]    +- com.esotericsoftware.reflectasm:reflectasm:jar:shaded:1.07:compile
[INFO]    |  \- org.ow2.asm:asm:jar:4.0:compile
[INFO]    +- com.esotericsoftware.minlog:minlog:jar:1.2:compile
[INFO]    \- org.objenesis:objenesis:jar:1.2:compile
[INFO] ------------------------------------------------------------------------

person user2250246    schedule 03.11.2016    source источник
comment
Ну, например, reflectasm-1.07-shaded.jar и kryo-2.21.jar оба приносят одни и те же классы, то есть одно и то же полное имя. Поэтому вам нужно решить, какой из них вы исключите, чтобы исправить это. Если они исходят от транзитивной зависимости, исключите ее. В противном случае выберите контент с помощью include/exclude.   -  person Tunaki    schedule 03.11.2016
comment
Не будет ли это проблемой, если я исключим одну из зависимостей только на основе более низкой/высокой версии?   -  person user2250246    schedule 03.11.2016
comment
Я думаю, что правильным поведением здесь должна быть возможность переупаковывать зависимости, которые имеют разные версии. Таким образом, foo.bar.HelloWorld должен стать foo.bar.one.HelloWorld для версии 1 и foo.bar.two.HelloWorld для версии 2. В любом случае, для зависимостей с той же версией это не проблема.   -  person user2250246    schedule 03.11.2016
comment
(Мысли вслух) Кажется очень странным, что reflectasm-1.07-shaded.jar и kryo-2.21.jar определяют классы в одном и том же пакете с одним и тем же именем. Разве kryo-2.21 не заметил бы этого, когда делал свои собственные сборки? Те же классы с теми же именами пакетов, что и зависимости, должны быть очень редкими ИМХО. Пример: зачем крио объявлять org.objenesis.ObjenesisBase в своей кодовой базе?   -  person user2250246    schedule 03.11.2016
comment
Боюсь, на этот вопрос могли ответить только разработчики этой библиотеки...   -  person Tunaki    schedule 03.11.2016
comment
Я добавил тег kryo к вопросу :)   -  person user2250246    schedule 03.11.2016
comment
@radistao Я не верю, что это дубликат. Kryo делает что-то очень необычное для сборки maven: они включают классы из совершенно другого проекта с открытым исходным кодом (objenesis), но не затеняют/переименовывают их.   -  person Brad Cupit    schedule 10.03.2017
comment
вы правы: удален флаг дублирования и добавлено описание к ответу: stackoverflow.com/a/42628444/907576   -  person radistao    schedule 11.03.2017


Ответы (1)


Проблема была в kryo-2.21, кажется, исправлена ​​в kryo-2.22.

За кулисами:

kryo-2.21 пакет содержит:

  • ком
  • МЕТА-ИНФ
  • org/objenesis/*
  • минлог-1.2.jar
  • objenesis-1.2.jar
  • Reflectasm-1.07-затененный.jar

а сам objenesis-1.2.jar содержит:

  • МЕТА-ИНФ
  • org/objenesis/*

Таким образом, и корневой kryo, и внутренний objenesis-1.2.jar архивы содержат классы org/objenesis/*!

То же самое для библиотеки reflectasm: она включена как классы непосредственно в kryo/com/* и как jar kryo/reflectasm-1.07-shaded.jar

Это, кажется, должно быть зафиксировано в kryo-2.22, угадать это minimizeJar построить свойство делает эффект

В других случаях, как исключить перекрытие из нескольких библиотек, см. Maven build [ПРЕДУПРЕЖДЕНИЕ ] у нас есть повторяющийся класс

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

mvn clean package

person radistao    schedule 06.03.2017