Pytanie Maven shade plugin warning: mamy duplikat - jak to naprawić?


To jest mój projekt POM (link do pasty, abyś mógł kliknąć prawym przyciskiem myszy> zapisz jako pom.xml)

<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>com.zybnet</groupId>
    <artifactId>excel-reporter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mvn1</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>4.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>${project.build.sourceDirectory}</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <finalName>${artifactId}-${version}-tmp</finalName>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.7.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.zybnet.Main</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

Postępowałem zgodnie z poradą dotyczącą konfigurowania domyślnej wtyczki jar, zgodnie z reklamą FAQ, ale wciąż, kiedy biegnę mvn package wydano około 20K ostrzeżeń. Bieganie mvn clean też nie pomaga.

Według ta odpowiedź, Mogę ręcznie wykluczyć niektóre zależności. Nie wiem jednak, czy jest to właściwa droga, a drzewo zależności jest dość skomplikowane, więc trudno jest stwierdzić, od czego zacząć.

Wiem, że te problemy nie są szkodliwe, ale jestem przyzwyczajony do traktowania ostrzeżeń jako czegoś, co musi zostać naprawione. Co więcej, jestem początkującym użytkownikiem Mavena, więc chciałbym zrozumieć, co jest nie tak z moim zrozumieniem i jak rozwiązywać problemy.

(Używanie wtyczki do instalacji maven nie jest tutaj opcją)


21
2017-08-06 08:10


pochodzenie




Odpowiedzi:


Czasami zdarza się, że ta sama definicja klasy znajduje się w dwóch lub więcej plikach JAR (zwykle są to pliki zależne JAR). W takim przypadku deweloper nie może nic zrobić poza próbą wykrycia, co ręcznie wykluczyć z zależności lub z ostatecznego artefaktu (być może przy pomocy mvn dependency:tree -Ddetail=true). ja otworzył problem i przesłał łatkę, aby pomóc programistom z nieco ładniejszym wyjściem, jak

[WARNING] xml-apis-1.3.02.jar, xmlbeans-2.3.0.jar define 4 overlappping classes:
[WARNING]   - org.w3c.dom.TypeInfo
[WARNING]   - org.w3c.dom.DOMConfiguration
[WARNING]   - org.w3c.dom.DOMStringList
[WARNING]   - org.w3c.dom.UserDataHandler
[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 skip these
[WARNING] warnings, otherwise try to manually exclude artifacts
[WARNING] based on mvn dependency:tree -Ddetail=true and the above
[WARNING] output
[WARNING] See http://docs.codehaus.org/display/MAVENUSER/Shade+Plugin

Używanie tego wyjścia i tego z mvn dependency:tree Dodałem sekcje takie jak

<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>4.7.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </exclusion>
        <exclusion>
            <groupId>bouncycastle</groupId>
            <artifactId>bcmail-jdk14</artifactId>
        </exclusion>
        <exclusion>
            <groupId>bouncycastle</groupId>
            <artifactId>bcprov-jdk14</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bctsp-jdk14</artifactId>
        </exclusion>
    </exclusions>
</dependency>

i udało się zmniejszyć liczbę ostrzeżeń z kilku tysięcy do kilkudziesięciu. Mimo to nie jest to doskonałe. Nadal jednak kontynuują kopiowanie klas prowadzących do konfliktów nazw (nie rozumiem dlaczego). Jednak to rozwiązanie jest specyficzne dla tego konkretnego projektu i nie można go łatwo przenieść na cokolwiek innego.


25
2017-08-06 16:57





Nowszą aktualizacją tego problemu jest aktualizacja do aktualnej wtyczki maven. Pytanie jest za pomocą

<version>1.7.1</version>

który powie ci tylko, że:

We have a duplicate org/eclipse/persistence/internal/libraries/asm/AnnotationVisitor.class in /Users/.../repository/org/eclipse/persistence/eclipselink/2.7.0/eclipselink-2.7.0.jar

Pozostawiając do zgadywania lub prób i błędów, gdzie pierwszy wpis, w którym nakładają się klasy. Niezbyt przydatne. Szczęśliwie,

 <version>3.1.0</version>

da ci bardziej użyteczny wynik, który zawiera słoiki, z których pochodzą: na przykład

annotations-3.0.1.jar, jcip-annotations-1.0.jar define 4 overlapping classes: 
  - net.jcip.annotations.GuardedBy
  - net.jcip.annotations.NotThreadSafe
  ...

Możesz wtedy zdecydować o wykluczeniu jednego lub drugiego lub użyć cienia, aby zmienić nazwy zajęć zgodnie z projektem.


2
2017-09-14 20:00