[JAVA] Comment faire un pot ombré

Qu'est-ce que le pot ombré?

L'un des moyens d'éviter l'enfer des dépendances en Java.

Supposons que la base de code d'origine dépende de la version X de la bibliothèque A. Je souhaite ajouter une nouvelle bibliothèque B à cette base de code. Cependant, la bibliothèque B dépend de la version Y de la bibliothèque A, Considérez la situation où les versions X et Y de la bibliothèque A sont incompatibles.

CodeBase
 |- Library A, Version X
 |- Library B
    |- Library A, Version Y # Conflict!!!

En l'état, que vous sélectionniez la version X ou Y de la bibliothèque A, les nouvelles fonctions et les fonctions existantes Vous ne pouvez pas déplacer les deux en même temps.

C'est là qu'intervient le pot ombré. La méthode consiste à regrouper toutes les classes de classe Y de la bibliothèque A avec la bibliothèque B et à créer la bibliothèque B sans dépendances.

CodeBase
 |- Library A, Version X
 |- Library B' (include Library A, Version Y)

relocation Cependant, en l'état, la classe incluse dans la bibliothèque A et la classe de la bibliothèque A incluse dans la bibliothèque B sont placées dans le même chemin de classe, de sorte que le conflit ne peut pas être résolu.

libraryA-versionX.jar


com.foo.libraryA.Bar.class
...

libraryB'.jar


com.bar.libraryB.Example.class
...
com.foo.libraryA.Bar.class # Conflict!!
...

C'est là qu'intervient la réinstallation. En modifiant le nom du package de la bibliothèque A inclus dans la bibliothèque B, les conflits de classe sont résolus.

libraryB'.jar


com.bar.libraryB.Example.class
...
shaded.com.foo.libraryA.Bar.class # No Conflict :)
...

Dans cet exemple, «com.foo.libraryA» est remplacé par «shaded.com.foo.libraryA». Il ne s'agit pas seulement de le renommer, mais aussi de réécrire toutes les références aux classes de la bibliothèque A incluses dans la bibliothèque B.

Comment faire un pot ombré

Dans cet article, je vais vous expliquer comment utiliser maven.

Ajoutez la bibliothèque que vous souhaitez ajouter comme exemple com.google.firebase: firebase-admin, Disons que la bibliothèque avec laquelle vous voulez éviter les conflits est com.google.guava: guava.

Tout d'abord, préparez le fichier pom suivant.

pom.xml


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>shadeex</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.google.firebase/firebase-admin -->
        <dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>6.13.0</version>
        </dependency>
    </dependencies>
        
</project>

Vérifions la dépendance de firebase-admin.

$ mvn dependency:tree
...
INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ shadeex ---
[INFO] com.example:shadeex:jar:1.0.0
[INFO] \- com.google.firebase:firebase-admin:jar:6.13.0:compile
[INFO]    +- com.google.api-client:google-api-client:jar:1.30.1:compile
[INFO]    |  +- com.google.oauth-client:google-oauth-client:jar:1.30.1:compile
[INFO]    |  \- com.google.http-client:google-http-client-jackson2:jar:1.30.1:compile
[INFO]    |     \- com.fasterxml.jackson.core:jackson-core:jar:2.9.9:compile
[INFO]    +- com.google.api-client:google-api-client-gson:jar:1.30.1:compile
[INFO]    |  \- com.google.http-client:google-http-client-gson:jar:1.30.1:compile
[INFO]    |     \- com.google.code.gson:gson:jar:2.8.5:compile
[INFO]    +- com.google.http-client:google-http-client:jar:1.30.1:compile
[INFO]    |  +- org.apache.httpcomponents:httpclient:jar:4.5.8:compile
[INFO]    |  |  +- org.apache.httpcomponents:httpcore:jar:4.4.11:compile
[INFO]    |  |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO]    |  |  \- commons-codec:commons-codec:jar:1.11:compile
[INFO]    |  +- com.google.code.findbugs:jsr305:jar:3.0.2:compile
[INFO]    |  +- com.google.j2objc:j2objc-annotations:jar:1.3:compile
[INFO]    |  +- io.opencensus:opencensus-api:jar:0.21.0:compile
[INFO]    |  |  \- io.grpc:grpc-context:jar:1.19.0:compile
[INFO]    |  \- io.opencensus:opencensus-contrib-http-util:jar:0.21.0:compile
[INFO]    +- com.google.api:api-common:jar:1.8.1:compile
[INFO]    |  \- javax.annotation:javax.annotation-api:jar:1.3.2:compile
[INFO]    +- com.google.auth:google-auth-library-oauth2-http:jar:0.17.1:compile
[INFO]    |  +- com.google.auto.value:auto-value-annotations:jar:1.6.6:compile
[INFO]    |  \- com.google.auth:google-auth-library-credentials:jar:0.17.1:compile
[INFO]    +- com.google.cloud:google-cloud-storage:jar:1.91.0:compile
[INFO]    |  +- com.google.cloud:google-cloud-core-http:jar:1.90.0:compile
[INFO]    |  |  +- com.google.cloud:google-cloud-core:jar:1.90.0:compile
[INFO]    |  |  |  +- com.google.protobuf:protobuf-java-util:jar:3.9.1:compile
[INFO]    |  |  |  |  \- com.google.errorprone:error_prone_annotations:jar:2.3.2:compile
[INFO]    |  |  |  \- com.google.api.grpc:proto-google-iam-v1:jar:0.12.0:compile
[INFO]    |  |  +- com.google.http-client:google-http-client-appengine:jar:1.31.0:compile
[INFO]    |  |  \- com.google.api:gax-httpjson:jar:0.65.1:compile
[INFO]    |  |     \- org.threeten:threetenbp:jar:1.3.3:compile
[INFO]    |  \- com.google.apis:google-api-services-storage:jar:v1-rev20190624-1.30.1:compile
[INFO]    +- com.google.cloud:google-cloud-firestore:jar:1.31.0:compile
[INFO]    |  +- com.google.cloud:google-cloud-core-grpc:jar:1.91.3:compile
[INFO]    |  |  +- com.google.api:gax:jar:1.49.1:compile
[INFO]    |  |  \- com.google.api:gax-grpc:jar:1.49.1:compile
[INFO]    |  |     +- io.grpc:grpc-stub:jar:1.23.0:compile
[INFO]    |  |     |  \- io.grpc:grpc-api:jar:1.23.0:compile
[INFO]    |  |     +- io.grpc:grpc-auth:jar:1.23.0:compile
[INFO]    |  |     +- io.grpc:grpc-protobuf:jar:1.23.0:compile
[INFO]    |  |     |  \- io.grpc:grpc-protobuf-lite:jar:1.23.0:compile
[INFO]    |  |     +- io.grpc:grpc-netty-shaded:jar:1.23.0:compile
[INFO]    |  |     |  \- io.grpc:grpc-core:jar:1.23.0:compile (version selected from constraint [1.23.0,1.23.0])
[INFO]    |  |     |     +- com.google.android:annotations:jar:4.1.1.4:compile
[INFO]    |  |     |     +- io.perfmark:perfmark-api:jar:0.17.0:compile
[INFO]    |  |     |     \- io.opencensus:opencensus-contrib-grpc-metrics:jar:0.21.0:compile
[INFO]    |  |     \- io.grpc:grpc-alts:jar:1.23.0:compile
[INFO]    |  |        +- io.grpc:grpc-grpclb:jar:1.23.0:compile
[INFO]    |  |        \- org.apache.commons:commons-lang3:jar:3.5:compile
[INFO]    |  +- com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:1.31.0:compile
[INFO]    |  |  +- com.google.protobuf:protobuf-java:jar:3.10.0:compile
[INFO]    |  |  \- com.google.api.grpc:proto-google-common-protos:jar:1.17.0:compile
[INFO]    |  +- com.google.api.grpc:proto-google-cloud-firestore-v1:jar:1.31.0:compile
[INFO]    |  +- com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:0.84.0:compile
[INFO]    |  \- io.opencensus:opencensus-contrib-grpc-util:jar:0.24.0:compile
[INFO]    +- com.google.guava:guava:jar:26.0-android:compile
[INFO]    |  +- org.checkerframework:checker-compat-qual:jar:2.5.2:compile
[INFO]    |  \- org.codehaus.mojo:animal-sniffer-annotations:jar:1.14:compile
[INFO]    +- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO]    +- io.netty:netty-codec-http:jar:4.1.45.Final:compile
[INFO]    |  +- io.netty:netty-common:jar:4.1.45.Final:compile
[INFO]    |  +- io.netty:netty-buffer:jar:4.1.45.Final:compile
[INFO]    |  \- io.netty:netty-codec:jar:4.1.45.Final:compile
[INFO]    +- io.netty:netty-handler:jar:4.1.45.Final:compile
[INFO]    \- io.netty:netty-transport:jar:4.1.45.Final:compile
[INFO]       \- io.netty:netty-resolver:jar:4.1.45.Final:compile
...

Cela semble dépendre de com.google.guava: guava: jar: 26.0-android: compile. Il est désagréable de dépendre de la version pour ʻandroid, alors réécrivez-la dans la version pour jdk` Ajoutons-le à la dépendance.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>shadeex</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.google.firebase/firebase-admin -->
        <dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>6.13.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>26.0-jre</version>
        </dependency>
    </dependencies>
        
</project>

Si vous vérifiez à nouveau la dépendance, ce sera comme suit.

$ mvn dependency:tree
...
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ shadeex ---
[INFO] com.example:shadeex:jar:1.0.0
[INFO] +- com.google.firebase:firebase-admin:jar:6.13.0:compile
[INFO] |  +- com.google.api-client:google-api-client:jar:1.30.1:compile
[INFO] |  |  +- com.google.oauth-client:google-oauth-client:jar:1.30.1:compile
[INFO] |  |  \- com.google.http-client:google-http-client-jackson2:jar:1.30.1:compile
[INFO] |  |     \- com.fasterxml.jackson.core:jackson-core:jar:2.9.9:compile
[INFO] |  +- com.google.api-client:google-api-client-gson:jar:1.30.1:compile
[INFO] |  |  \- com.google.http-client:google-http-client-gson:jar:1.30.1:compile
[INFO] |  |     \- com.google.code.gson:gson:jar:2.8.5:compile
[INFO] |  +- com.google.http-client:google-http-client:jar:1.30.1:compile
[INFO] |  |  +- org.apache.httpcomponents:httpclient:jar:4.5.8:compile
[INFO] |  |  |  +- org.apache.httpcomponents:httpcore:jar:4.4.11:compile
[INFO] |  |  |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  |  |  \- commons-codec:commons-codec:jar:1.11:compile
[INFO] |  |  +- io.opencensus:opencensus-api:jar:0.21.0:compile
[INFO] |  |  |  \- io.grpc:grpc-context:jar:1.19.0:compile
[INFO] |  |  \- io.opencensus:opencensus-contrib-http-util:jar:0.21.0:compile
[INFO] |  +- com.google.api:api-common:jar:1.8.1:compile
[INFO] |  |  \- javax.annotation:javax.annotation-api:jar:1.3.2:compile
[INFO] |  +- com.google.auth:google-auth-library-oauth2-http:jar:0.17.1:compile
[INFO] |  |  +- com.google.auto.value:auto-value-annotations:jar:1.6.6:compile
[INFO] |  |  \- com.google.auth:google-auth-library-credentials:jar:0.17.1:compile
[INFO] |  +- com.google.cloud:google-cloud-storage:jar:1.91.0:compile
[INFO] |  |  +- com.google.cloud:google-cloud-core-http:jar:1.90.0:compile
[INFO] |  |  |  +- com.google.cloud:google-cloud-core:jar:1.90.0:compile
[INFO] |  |  |  |  +- com.google.protobuf:protobuf-java-util:jar:3.9.1:compile
[INFO] |  |  |  |  |  \- com.google.errorprone:error_prone_annotations:jar:2.3.2:compile
[INFO] |  |  |  |  \- com.google.api.grpc:proto-google-iam-v1:jar:0.12.0:compile
[INFO] |  |  |  +- com.google.http-client:google-http-client-appengine:jar:1.31.0:compile
[INFO] |  |  |  \- com.google.api:gax-httpjson:jar:0.65.1:compile
[INFO] |  |  |     \- org.threeten:threetenbp:jar:1.3.3:compile
[INFO] |  |  \- com.google.apis:google-api-services-storage:jar:v1-rev20190624-1.30.1:compile
[INFO] |  +- com.google.cloud:google-cloud-firestore:jar:1.31.0:compile
[INFO] |  |  +- com.google.cloud:google-cloud-core-grpc:jar:1.91.3:compile
[INFO] |  |  |  +- com.google.api:gax:jar:1.49.1:compile
[INFO] |  |  |  \- com.google.api:gax-grpc:jar:1.49.1:compile
[INFO] |  |  |     +- io.grpc:grpc-stub:jar:1.23.0:compile
[INFO] |  |  |     |  \- io.grpc:grpc-api:jar:1.23.0:compile
[INFO] |  |  |     +- io.grpc:grpc-auth:jar:1.23.0:compile
[INFO] |  |  |     +- io.grpc:grpc-protobuf:jar:1.23.0:compile
[INFO] |  |  |     |  \- io.grpc:grpc-protobuf-lite:jar:1.23.0:compile
[INFO] |  |  |     +- io.grpc:grpc-netty-shaded:jar:1.23.0:compile
[INFO] |  |  |     |  \- io.grpc:grpc-core:jar:1.23.0:compile (version selected from constraint [1.23.0,1.23.0])
[INFO] |  |  |     |     +- com.google.android:annotations:jar:4.1.1.4:compile
[INFO] |  |  |     |     +- io.perfmark:perfmark-api:jar:0.17.0:compile
[INFO] |  |  |     |     \- io.opencensus:opencensus-contrib-grpc-metrics:jar:0.21.0:compile
[INFO] |  |  |     \- io.grpc:grpc-alts:jar:1.23.0:compile
[INFO] |  |  |        +- io.grpc:grpc-grpclb:jar:1.23.0:compile
[INFO] |  |  |        \- org.apache.commons:commons-lang3:jar:3.5:compile
[INFO] |  |  +- com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:1.31.0:compile
[INFO] |  |  |  +- com.google.protobuf:protobuf-java:jar:3.10.0:compile
[INFO] |  |  |  \- com.google.api.grpc:proto-google-common-protos:jar:1.17.0:compile
[INFO] |  |  +- com.google.api.grpc:proto-google-cloud-firestore-v1:jar:1.31.0:compile
[INFO] |  |  +- com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:0.84.0:compile
[INFO] |  |  \- io.opencensus:opencensus-contrib-grpc-util:jar:0.24.0:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO] |  +- io.netty:netty-codec-http:jar:4.1.45.Final:compile
[INFO] |  |  +- io.netty:netty-common:jar:4.1.45.Final:compile
[INFO] |  |  +- io.netty:netty-buffer:jar:4.1.45.Final:compile
[INFO] |  |  \- io.netty:netty-codec:jar:4.1.45.Final:compile
[INFO] |  +- io.netty:netty-handler:jar:4.1.45.Final:compile
[INFO] |  \- io.netty:netty-transport:jar:4.1.45.Final:compile
[INFO] |     \- io.netty:netty-resolver:jar:4.1.45.Final:compile
[INFO] \- com.google.guava:guava:jar:26.0-jre:compile
[INFO]    +- com.google.code.findbugs:jsr305:jar:3.0.2:compile
[INFO]    +- org.checkerframework:checker-qual:jar:2.5.2:compile
[INFO]    +- com.google.j2objc:j2objc-annotations:jar:1.1:compile
[INFO]    \- org.codehaus.mojo:animal-sniffer-annotations:jar:1.14:compile
...

Maintenant, configurons le pot ombré à partir d'ici.

pom.xml


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>shadeex</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                          ...
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    ... 
</project>

Utilisez maven-shade-plugin pour créer un pot d'ombre.

Les éléments suivants sont importants, expliquons donc en détail.

<configuration>
    <artifactSet>
        <includes>
            <include>com.google.guava:guava</include>
            <include>com.google.firebase:firebase-admin</include>
        </includes>
    </artifactSet>
    <relocations>
        <relocation>
            <pattern>com.google</pattern>
            <shadedPattern>com.example.shaded.com.google</shadedPattern>
            <excludes>
                <exclude>com.google.firebase.**</exclude>
            </excludes>
        </relocation>
    </relocations>
</configuration>

Utilisez <artifactSet> pour définir la liste des artefacts inclus dans shaded-jar. Cette fois, le principal firebase-admin et la bibliothèque dépendante goyave que vous voulez regrouper sont spécifiés.

Définissez la relocalisation avec <relocations>. Ajoutez le préfixe du package java que vous souhaitez déplacer vers <pattern>. guava.jar contient com.google.common. ** ʻet com.google.thirdparty. ** J'ai donc spécifié «com.google». D'autre part,firebase-admin contient com.google.firebase. **`, Puisqu'il n'est pas nécessaire de déplacer «firebase-admin» lui-même, il est exclu par «».

Ceci termine les réglages. Exécutons-le et voyons quel type de pot est créé.

$ mvn package

Shaded-jar est envoyé vers target / shaded-1.0.0.jar. Si vous vérifiez le contenu, vous pouvez voir que la classe incluse dans guava.jar est certainement déplacée.

$ unzip -l target/shadeex-1.0.0.jar  | grep 'com/example/shaded' | head
        0  04-13-2020 17:23   com/example/shaded/
        0  04-13-2020 17:23   com/example/shaded/com/
        0  04-13-2020 17:23   com/example/shaded/com/google/
        0  04-13-2020 17:23   com/example/shaded/com/google/common/
        0  04-13-2020 17:23   com/example/shaded/com/google/common/annotations/
      624  04-13-2020 17:23   com/example/shaded/com/google/common/annotations/Beta.class
      678  04-13-2020 17:23   com/example/shaded/com/google/common/annotations/GwtCompatible.class
      686  04-13-2020 17:23   com/example/shaded/com/google/common/annotations/GwtIncompatible.class
      312  04-13-2020 17:23   com/example/shaded/com/google/common/annotations/VisibleForTesting.class
        0  04-13-2020 17:23   com/example/shaded/com/google/common/base/

En revanche, la classe de firebase-admin.jar n'est pas déplacée.

$ unzip -l target/shadeex-1.0.0.jar  | grep -v 'shaded' | grep 'com/google' | head
        0  05-14-2020 19:36   com/google/
        0  05-14-2020 19:36   com/google/firebase/
        0  05-14-2020 19:36   com/google/firebase/messaging/
     1647  05-14-2020 19:36   com/google/firebase/messaging/Notification$Builder.class
     4528  05-14-2020 19:36   com/google/firebase/messaging/AndroidConfig$Builder.class
     1340  05-14-2020 19:36   com/google/firebase/messaging/AndroidFcmOptions$Builder.class
      277  05-14-2020 19:36   com/google/firebase/messaging/TopicManagementResponse$1.class
     1492  05-14-2020 19:36   com/google/firebase/messaging/TopicManagementResponse$Error.class
      409  05-14-2020 19:36   com/google/firebase/messaging/BatchResponse.class
     2910  05-14-2020 19:36   com/google/firebase/messaging/CriticalSound.class

De plus, les autres classes de bibliothèques dépendantes ne sont pas incluses.

$ unzip -l target/shadeex-1.0.0.jar  | grep -v 'shaded' | grep -v 'com/google' 
Archive:  target/shadeex-1.0.0.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  06-11-2020 00:24   META-INF/
      135  06-11-2020 00:24   META-INF/MANIFEST.MF
        0  06-11-2020 00:24   META-INF/maven/
        0  06-11-2020 00:24   META-INF/maven/com.example/
        0  06-11-2020 00:24   META-INF/maven/com.example/shadeex/
     2603  06-11-2020 00:24   META-INF/maven/com.example/shadeex/pom.xml
      103  06-10-2020 23:05   META-INF/maven/com.example/shadeex/pom.properties
      599  05-14-2020 19:36   admin_sdk.properties
        0  05-14-2020 19:36   com/
        0  05-14-2020 19:35   META-INF/maven/com.google.firebase/
        0  05-14-2020 19:35   META-INF/maven/com.google.firebase/firebase-admin/
    19833  05-14-2020 19:35   META-INF/maven/com.google.firebase/firebase-admin/pom.xml
      119  05-14-2020 19:36   META-INF/maven/com.google.firebase/firebase-admin/pom.properties
        0  04-13-2020 17:23   META-INF/maven/com.google.guava/
        0  04-13-2020 17:23   META-INF/maven/com.google.guava/guava/
      133  04-13-2020 17:23   META-INF/maven/com.google.guava/guava/pom.properties
    10920  04-13-2020 17:12   META-INF/maven/com.google.guava/guava/pom.xml
        0  04-13-2020 17:23   com/example/
---------                     -------
  8638864                     2699 files

maven-shadow-plugin renvoie pom.xml pour shaded-jar vers dependency-reded-pom.xml.

dependency-reduced-pom.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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>shadeex</artifactId>
  <version>1.0.0</version>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.4</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <artifactSet>
                <includes>
                  <include>com.google.guava:guava</include>
                  <include>com.google.firebase:firebase-admin</include>
                </includes>
              </artifactSet>
              <relocations>
                <relocation>
                  <pattern>com.google</pattern>
                  <shadedPattern>com.example.shaded.com.google</shadedPattern>
                  <excludes>
                    <exclude>com.google.firebase.**</exclude>
                  </excludes>
                </relocation>
              </relocations>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Vous pouvez voir que les dépendances incluses guava et firebase-admin ont disparu.

Cependant, il y a un problème avec ce pom. Autrement dit, il y avait d'autres bibliothèques dépendantes pour firebase-admin en plus de guava.

$ mvn dependency:tree
...
INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ shadeex ---
[INFO] com.example:shadeex:jar:1.0.0
[INFO] \- com.google.firebase:firebase-admin:jar:6.13.0:compile
[INFO]    +- com.google.api-client:google-api-client:jar:1.30.1:compile
[INFO]    |  +- com.google.oauth-client:google-oauth-client:jar:1.30.1:compile
[INFO]    |  \- com.google.http-client:google-http-client-jackson2:jar:1.30.1:compile
[INFO]    |     \- com.fasterxml.jackson.core:jackson-core:jar:2.9.9:compile
[INFO]    +- com.google.api-client:google-api-client-gson:jar:1.30.1:compile
[INFO]    |  \- com.google.http-client:google-http-client-gson:jar:1.30.1:compile
[INFO]    |     \- com.google.code.gson:gson:jar:2.8.5:compile
[INFO]    +- com.google.http-client:google-http-client:jar:1.30.1:compile
[INFO]    |  +- org.apache.httpcomponents:httpclient:jar:4.5.8:compile
[INFO]    |  |  +- org.apache.httpcomponents:httpcore:jar:4.4.11:compile
[INFO]    |  |  +- commons-logging:commons-logging:jar:1.2:compile
[INFO]    |  |  \- commons-codec:commons-codec:jar:1.11:compile
[INFO]    |  +- com.google.code.findbugs:jsr305:jar:3.0.2:compile
[INFO]    |  +- com.google.j2objc:j2objc-annotations:jar:1.3:compile
[INFO]    |  +- io.opencensus:opencensus-api:jar:0.21.0:compile
[INFO]    |  |  \- io.grpc:grpc-context:jar:1.19.0:compile
[INFO]    |  \- io.opencensus:opencensus-contrib-http-util:jar:0.21.0:compile
[INFO]    +- com.google.api:api-common:jar:1.8.1:compile
[INFO]    |  \- javax.annotation:javax.annotation-api:jar:1.3.2:compile
[INFO]    +- com.google.auth:google-auth-library-oauth2-http:jar:0.17.1:compile
[INFO]    |  +- com.google.auto.value:auto-value-annotations:jar:1.6.6:compile
[INFO]    |  \- com.google.auth:google-auth-library-credentials:jar:0.17.1:compile
[INFO]    +- com.google.cloud:google-cloud-storage:jar:1.91.0:compile
[INFO]    |  +- com.google.cloud:google-cloud-core-http:jar:1.90.0:compile
[INFO]    |  |  +- com.google.cloud:google-cloud-core:jar:1.90.0:compile
[INFO]    |  |  |  +- com.google.protobuf:protobuf-java-util:jar:3.9.1:compile
[INFO]    |  |  |  |  \- com.google.errorprone:error_prone_annotations:jar:2.3.2:compile
[INFO]    |  |  |  \- com.google.api.grpc:proto-google-iam-v1:jar:0.12.0:compile
[INFO]    |  |  +- com.google.http-client:google-http-client-appengine:jar:1.31.0:compile
[INFO]    |  |  \- com.google.api:gax-httpjson:jar:0.65.1:compile
[INFO]    |  |     \- org.threeten:threetenbp:jar:1.3.3:compile
[INFO]    |  \- com.google.apis:google-api-services-storage:jar:v1-rev20190624-1.30.1:compile
[INFO]    +- com.google.cloud:google-cloud-firestore:jar:1.31.0:compile
[INFO]    |  +- com.google.cloud:google-cloud-core-grpc:jar:1.91.3:compile
[INFO]    |  |  +- com.google.api:gax:jar:1.49.1:compile
[INFO]    |  |  \- com.google.api:gax-grpc:jar:1.49.1:compile
[INFO]    |  |     +- io.grpc:grpc-stub:jar:1.23.0:compile
[INFO]    |  |     |  \- io.grpc:grpc-api:jar:1.23.0:compile
[INFO]    |  |     +- io.grpc:grpc-auth:jar:1.23.0:compile
[INFO]    |  |     +- io.grpc:grpc-protobuf:jar:1.23.0:compile
[INFO]    |  |     |  \- io.grpc:grpc-protobuf-lite:jar:1.23.0:compile
[INFO]    |  |     +- io.grpc:grpc-netty-shaded:jar:1.23.0:compile
[INFO]    |  |     |  \- io.grpc:grpc-core:jar:1.23.0:compile (version selected from constraint [1.23.0,1.23.0])
[INFO]    |  |     |     +- com.google.android:annotations:jar:4.1.1.4:compile
[INFO]    |  |     |     +- io.perfmark:perfmark-api:jar:0.17.0:compile
[INFO]    |  |     |     \- io.opencensus:opencensus-contrib-grpc-metrics:jar:0.21.0:compile
[INFO]    |  |     \- io.grpc:grpc-alts:jar:1.23.0:compile
[INFO]    |  |        +- io.grpc:grpc-grpclb:jar:1.23.0:compile
[INFO]    |  |        \- org.apache.commons:commons-lang3:jar:3.5:compile
[INFO]    |  +- com.google.api.grpc:proto-google-cloud-firestore-admin-v1:jar:1.31.0:compile
[INFO]    |  |  +- com.google.protobuf:protobuf-java:jar:3.10.0:compile
[INFO]    |  |  \- com.google.api.grpc:proto-google-common-protos:jar:1.17.0:compile
[INFO]    |  +- com.google.api.grpc:proto-google-cloud-firestore-v1:jar:1.31.0:compile
[INFO]    |  +- com.google.api.grpc:proto-google-cloud-firestore-v1beta1:jar:0.84.0:compile
[INFO]    |  \- io.opencensus:opencensus-contrib-grpc-util:jar:0.24.0:compile
[INFO]    +- com.google.guava:guava:jar:26.0-android:compile
[INFO]    |  +- org.checkerframework:checker-compat-qual:jar:2.5.2:compile
[INFO]    |  \- org.codehaus.mojo:animal-sniffer-annotations:jar:1.14:compile
[INFO]    +- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO]    +- io.netty:netty-codec-http:jar:4.1.45.Final:compile
[INFO]    |  +- io.netty:netty-common:jar:4.1.45.Final:compile
[INFO]    |  +- io.netty:netty-buffer:jar:4.1.45.Final:compile
[INFO]    |  \- io.netty:netty-codec:jar:4.1.45.Final:compile
[INFO]    +- io.netty:netty-handler:jar:4.1.45.Final:compile
[INFO]    \- io.netty:netty-transport:jar:4.1.45.Final:compile
[INFO]       \- io.netty:netty-resolver:jar:4.1.45.Final:compile

Cependant, dependency-reduction-pom.xml supprime les dépendances de ces bibliothèques.

L'option pour résoudre ce problème est «». En spécifiant cette option, toutes les bibliothèques dépendantes de firebase-admin seront listées comme dépendances directes de dependency-reduction-pom.xml, puis firebase-admin et goyave seront supprimés. ..

Par conséquent, les dépendances des bibliothèques qui ne sont pas incluses peuvent être laissées correctement.

Le pom.xml final ressemble à ceci:

pom.xml


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>shadeex</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
                            <artifactSet>
                                <includes>
                                    <include>com.google.guava:guava</include>
                                    <include>com.google.firebase:firebase-admin</include>
                                </includes>
                            </artifactSet>
                            <relocations>
                                <relocation>
                                    <pattern>com.google</pattern>
                                    <shadedPattern>com.example.shaded.com.google</shadedPattern>
                                    <excludes>
                                        <exclude>com.google.firebase.**</exclude>
                                    </excludes>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.google.firebase/firebase-admin -->
        <dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>6.13.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>29.0-jre</version>
        </dependency>
    </dependencies>
        
</project>

D'autre part, la sortie de "pom.xml-dependency-reduite" en exécutant le "package mvn" est la suivante.

dependency-reduced-pom.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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>shadeex</artifactId>
  <version>1.0.0</version>
  <build>
    ...
  </build>
  <dependencies>
    <dependency>
      <groupId>com.google.api-client</groupId>
      <artifactId>google-api-client</artifactId>
      <version>1.30.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.oauth-client</groupId>
      <artifactId>google-oauth-client</artifactId>
      <version>1.30.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.http-client</groupId>
      <artifactId>google-http-client-jackson2</artifactId>
      <version>1.30.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.9</version>
      <scope>compile</scope>
    </dependency>
    ...
  </dependencies>
</project>

Les bibliothèques dépendantes de firebase-admin restent correctement.

Tout ce que vous avez à faire est de télécharger ce fichier jar et dependency-reduction-pom.xml dans le référentiel interne maven.

Les références

Apache Maven Shade Plugin

Recommended Posts

Comment faire un pot ombré
Java - Comment créer JTable
[Rails] Comment faire des graines
Comment créer un conteneur Java
Comment créer un pilote JDBC
Comment créer un écran de démarrage
Comment créer un plug-in Jenkins
Comment faire un projet Maven
Comment créer un tableau Java
[Android] Comment créer un fragment de dialogue
Comment créer un résumé de calendrier Java
Comment créer un robot Discord (Java)
Comment développer OpenSPIFe
Comment appeler AmazonSQSAsync
Comment utiliser Map
Comment écrire des rails
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser la carte
Comment réduire l'image de Spring Boot Docker
Comment utiliser collection_select
Comment rendre la logique de vérification en double plus lisible
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment installer Docker
Comment utiliser MapStruct
Comment utiliser TreeSet
Comment créer un JRE léger pour la distribution
Comment désinstaller Rails
Comment installer docker-machine
[Comment utiliser l'étiquette]
Comment écrire docker-compose
Comment utiliser l'identité
Comment créer un plug-in natif Unity (version Android)
Comment utiliser le hachage
Comment écrire Mockito
Comment créer docker-compose
Comment installer MySQL
Comment écrire un fichier de migration
Comment construire android-midi-lib
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment créer un lecteur de musique Android imposant
[Java] Comment rendre plusieurs boucles for uniques
Comment utiliser Map
Comment repousser la barre oblique \
Comment concaténer des chaînes