Maison  >  Article  >  Java  >  Comment utiliser le plug-in d'emballage Springboot pour supprimer les packages jar et affiner

Comment utiliser le plug-in d'emballage Springboot pour supprimer les packages jar et affiner

王林
王林avant
2023-05-16 17:13:061104parcourir

1. Configuration du fichier Pom

1.1 Ajoutez le plug-in maven-dependency-plugin pour copier le package jar référencé dans le chemin spécifié

Il est pratique pour le démarrage ultérieur de Tomcat de spécifier le chemin du package de dépendances

<!--拷贝依赖到jar外面的lib目录-->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>                <!--指定的依赖路径-->
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

La structure des répertoires après avoir utilisé ce plug-in pour construire Il existe un répertoire lib supplémentaire (c'est-à-dire le chemin spécifié par le outputDirectory configuré ci-dessus), qui contient le package jar dépendant :

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

1.2 Le projet springboot utilise le spring -plug-in d'emballage boot-maven-plugin

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
     <layout>ZIP</layout>
        <mainClass>
            com.iasp.BasicStarter
        </mainClass>
        <!--只包含自己-->
        <includes>
            <include>
                <groupId>${groupId}</groupId>
                <artifactId>${artifactId}</artifactId>
            </include>
         <!--或者-->
           <!--依赖jar不打进项目jar包中-->
             <!--<include>
                  <groupId>nothing</groupId>
                  <artifactId>nothing</artifactId>
             </include>-->
        </includes>
        <!--不包含哪些-->
        <!--<excludeGroupIds>-->
            <!--com.hundsun.jrescloud,-->
            <!--org.springframework.boot,-->
            <!--org.springframework-->
        <!--</excludeGroupIds>-->
    </configuration>

    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

pour configurer l'emballage ci-dessus. Après cela, le package jar correspondant sera exclu, ce qui rendra le package jar plat créé par le plug-in plus petit, ce qui facilitera le téléchargement vers le serveur pour la publication. L'effet est le suivant. Le répertoire lib sous le répertoire BOOT-INF a disparu :

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

Initialement saisi, la structure dans le package jar est

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

Spécifiez ensuite le chemin du package jar -Dloader. .path="../lib" au démarrage du projet, afin d'obtenir l'effet minceur, où les dépendances sont placées dans D:develop/shared/ Dans le répertoire fjar, exécutez la commande run

java -Dloader.path="D:develop/shared/fjar" -jar mytest.jar

Remarque : Un autre démarrage la solution est de spécifier le chemin sans ajouter -Dloader.path="D:develop/shared/fjar" et d'utiliser directement la commande suivante pour démarrer

java -jar mytest.jar

Utilisez le démarrage ci-dessus Si c'est le cas, vous devez ajouter le plugin maven-jar-plugin plug-in et configurez l'attribut De plus, lors du traitement de certains fichiers qui lisent des fichiers JAR exécutables, vous pouvez utiliser le plug-in maven-jar-plugin pour remplacer le spring-boot-maven-plugin pour les opérations d'empaquetage.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <!--addClasspath表示需要加入到类构建路径-->
                <addClasspath>true</addClasspath>
                <!--classpathPrefix指定生成的Manifest文件中Class-Path依赖lib前面都加上路径,构建出lib/xx.jar-->
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.common.util.CommonUtilsApplication</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

L'effet du plug-in ci-dessus est d'ajouter le fichier jar correspondant au chemin de classe au fichier MANIFEST.MF sous le répertoire META_INF du package, de sorte que lors du premier démarrage de l'application, seules les dépendances de version requises seront chargé selon le Class-Path. (Pour résoudre le problème des conflits de références de chargement multi-versions dans le répertoire partagé), cet effet équivaut à l'ajout du paramètre -classpath xxx (jar spécifique).

Pour le moment, placez simplement le répertoire jar requis lib dans le même répertoire que le xxx.jar à exécuter. Vous n'avez pas besoin d'ajouter le paramètre -Dloader.path lors du démarrage si le répertoire lib et le xxx. jar à exécuter ne sont pas dans le même répertoire, s'il s'agit du même répertoire de niveau, vous devez utiliser -Dloader.path pour démarrer

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

comme suit : Démarrer dans le répertoire de même niveau

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

Ne pas démarrer dans le répertoire de même niveau :

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

où -Dloader.path peut spécifier plusieurs répertoires, de sorte que lorsqu'il existe plusieurs microservices, certains fichiers jar utilisés publiquement puissent être placés dans un répertoire partagé et que des fichiers jar uniques à chaque microservice puissent être placés dans le répertoire privé du microservice (résoudre le problème des conflits de versions jar ), les exemples sont les suivants :

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

Remarque :

1 Lorsque vous utilisez -Dloader.path, vous devez ajouter ZIP lors de l'empaquetage. S'il n'est pas spécifié, -Dloader.path ne prendra pas effet

Pour alléger l'empaquetage de plusieurs microservices, il est recommandé d'utiliser l'empaquetage maven-jar-plugin pour éviter certains problèmes de démarrage d'application causés par le printemps. -mécanisme d'empaquetage boot-maven-plugin (piégé)

2. S'il existe différentes versions de dépendances :

Par exemple, le projet A dépend de la version 1.0 de la bibliothèque Y et le projet B dépend de la version 2.0 de la bibliothèque Y. il peut y avoir un conflit de dépendance de version (lorsque les deux versions sont incompatibles). Solution :

2.1 Tant que les versions sont cohérentes, continuez à utiliser la même version pour garantir des versions cohérentes. Vous pouvez utiliser la gestion des dépendances de version de maven pour le traitement, c'est-à-dire utiliser dans le fichier pom parent pour gérer uniformément les versions de dépendances

2.2. Laissez les projets dépendre des versions requises et placez-les dans le package war, puis ajoutez. autres packages jar de la même version. Placez-le sous le même package partagé

Le test révèle que les dépendances sont recherchées de haut en bas lors de la recherche. Si cela correspond, utilisez la première comme indiqué ci-dessous, le comm-0.0. La version 1.jar sera utilisée

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

Remarque :

En utilisant le plug-in spring-boot-maven-plugin, tous les packages jar dépendants seront empaquetés, de sorte que le package JAR généré puisse être exécuté directement, simplifier nos opérations de développement.

使用spring-boot-maven-plugin插件如果不指定程序主运行入口类的话默认为Main-Class: org.springframework.boot.loader.JarLauncher

Comment utiliser le plug-in demballage Springboot pour supprimer les packages jar et affiner

这个可以自定义执行主入口类,有以下几种方式:

1.POM继承spring-boot-starter-parent

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
<properties>
        <!-- The main class to start by executing java -jar -->
        <start-class>ccom.notes.JavaNotesApplication</start-class>
</properties>

2.POM不是继承spring-boot-starter-parent时需指定

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <version>2.1.9.RELEASE</version>
  <configuration>
    <mainClass>com.notes.JavaNotesApplication</mainClass>
    <layout>ZIP</layout>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
    </execution>
  </executions>
</plugin>

3.POM不是继承spring-boot-starter-paren,且使用maven-jar-plugin插件来指定执行的类

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
   <configuration>
      <archive>
         <manifest>
            <addClasspath>true</addClasspath>
            <useUniqueVersions>false</useUniqueVersions>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.notes.JavaNotesApplication</mainClass>
         </manifest>
         <manifestEntries>
            <version>${project.version}</version>
         </manifestEntries>
      </archive>
   </configuration>
</plugin>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer