[JAVA] Combinez des fichiers jar à l'échelle du système en un seul avec Maven Shade Plugin

Aperçu

--Maven Shade Plugin est un plugin Maven qui combine des fichiers jar dépendants en un seul fichier jar. --Maven Shade Plugin récupère les fichiers jar dans le référentiel, mais n'inclut pas les fichiers jar spécifiés dans la portée du système (sur le système de fichiers local)

organisation des fichiers

├── lib
│   └── my-lib-999.999.jar ← fichier jar qui n'existe que localement
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── App.java
        └── resources
            └── my-app.propriétés ← Fichier de ressources générales

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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0</version>

  <name>my-app</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>

    <!--Fichier jar local-->
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>my-lib</artifactId>
      <version>999.999</version>
      <scope>system</scope>
      <systemPath>${basedir}/lib/my-lib-999.999.jar</systemPath>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.9</version>
      <scope>compile</scope><!-- default scope -->
    </dependency>
  </dependencies>

  <build>
    <resources>
      <!--Paramètres de ressource par défaut-->
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
      <!--Paramètre pour inclure le fichier jar de la portée système en tant que ressource-->
      <resource>
        <directory>${project.basedir}</directory>
        <includes>
          <include>lib/*.jar</include>
        </includes>
      </resource>
    </resources>
    <plugins>
      <!--Introduction d'un plugin qui combine les fichiers jar dépendants en un seul fichier jar-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <!-- dependency-reduced-pom.Paramètres qui ne génèrent pas de XML-->
          <createDependencyReducedPom>false</createDependencyReducedPom>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

Générer un fichier jar

Générez un fichier jar avec la commande mvn package. Un message d'avertissement s'affiche car un fichier jar est spécifié dans la portée du système, mais cette fois, il est ignoré.

$ mvn package
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.example:my-app:jar:1.0
[WARNING] 'dependencies.dependency.systemPath' for com.example:my-lib:jar should not point at files within the project directory, ${basedir}/lib/my-lib-999.999.jar will be unresolvable by dependent projects @ line 27, column 19
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.

Si vous vérifiez le contenu du fichier jar généré, il contient lib / my-lib-999.999.jar spécifié dans la portée du système. La bibliothèque spécifiée dans la portée de compilation par défaut est incluse après avoir été développée dans le fichier de classe, tandis que celle spécifiée dans la portée système est incluse en tant que fichier jar. Même si vous le saisissez sous forme de bocal, il sera chargé correctement lorsqu'il fonctionnera, il n'y a donc pas de problème.

$ jar -t -f target/my-app-1.0.jar 
META-INF/
META-INF/MANIFEST.MF
lib/
lib/my-lib-999.999.jar
my-app.properties
com/
com/example/
com/example/App.class
META-INF/maven/
META-INF/maven/com.example/
META-INF/maven/com.example/my-app/
META-INF/maven/com.example/my-app/pom.xml
META-INF/maven/com.example/my-app/pom.properties
META-INF/LICENSE
META-INF/NOTICE
META-INF/maven/com.fasterxml.jackson.core/
META-INF/maven/com.fasterxml.jackson.core/jackson-core/
META-INF/maven/com.fasterxml.jackson.core/jackson-core/pom.properties
META-INF/maven/com.fasterxml.jackson.core/jackson-core/pom.xml
META-INF/services/
META-INF/services/com.fasterxml.jackson.core.JsonFactory
com/fasterxml/
com/fasterxml/jackson/
com/fasterxml/jackson/core/
com/fasterxml/jackson/core/Base64Variant.class
com/fasterxml/jackson/core/Base64Variants.class
com/fasterxml/jackson/core/FormatFeature.class
com/fasterxml/jackson/core/FormatSchema.class
(Ce qui suit est omis)

En tant qu'effet secondaire, le fichier original-my-app-1.0.jar, qui n'inclut normalement pas les fichiers jar dépendants, contient également des fichiers jar à l'échelle du système. Par conséquent, vous devez être prudent lorsque vous utilisez original- *. Jar.

$ jar -t -f target/original-my-app-1.0.jar
META-INF/
META-INF/MANIFEST.MF
lib/
com/
com/example/
lib/my-lib-999.999.jar
my-app.properties
com/example/App.class
META-INF/maven/
META-INF/maven/com.example/
META-INF/maven/com.example/my-app/
META-INF/maven/com.example/my-app/pom.xml
META-INF/maven/com.example/my-app/pom.properties

La portée du système n'est pas recommandée en premier lieu

Maven – Introduction to the Dependency Mechanism

System Dependencies Important note: This is deprecated.

Matériel de référence

Recommended Posts

Combinez des fichiers jar à l'échelle du système en un seul avec Maven Shade Plugin
Combinez des fichiers jar à l'échelle du système en un seul avec le plug-in de dépendance Maven
Créez des fichiers Jar dans le dossier du plugin en un clic avec IntelliJ
Premiers pas avec Gradle (jusqu'à ce que vous créiez un projet Java et combiniez des bibliothèques externes en un seul JAR exécutable)
Premiers pas avec Maven (jusqu'à ce que vous créiez un projet Java et combiniez des bibliothèques externes en un seul JAR exécutable)
Automatisez les tests d'intégration avec le plug-in Maven Failsafe