• Spring cloud的Maven插件(一):repackage目标


    简介

      Spring Boot Maven Plugin插件提供spring boot在maven中的支持。允许你打包可运行的jar包或war包。

      插件提供了几个maven目标和Spring Boot 应用一起工作。总的有:

      repackage:创建一个自动可执行的jar或war文件。它可以替换常规的artifact,或者用一个单独的classifier附属在maven构建的生命周期中。

      下面我们详细看下repackage这个目标。

    一、简单引用

       用了重新打包应用程序,我们需要在pom.xml文件中加一个简单的引用到Spring Boot Maven Plugin插件中,代码如下:repaceage 最简单的结构

     1 <build>
     2   ...
     3   <plugins>
     4     ...
     5     <plugin>
     6       <groupId>org.springframework.boot</groupId>
     7       <artifactId>spring-boot-maven-plugin</artifactId>
     8       <version>1.5.7.RELEASE</version>
     9       <executions>
    10         <execution>
    11           <goals>
    12             <goal>repackage</goal>
    13           </goals>
    14         </execution>
    15       </executions>
    16     </plugin>
    17     ...
    18   </plugins>
    19   ...
    20 </build>
    repaceage 最简单的结构

    二、剔除不需要的依赖

      这个例子重新打包了一个jar包或war包,这个jar包或war包被构建于maven生命周期的package阶段,包括定义在工程中的任何依赖(包括scope为provided)。如果有一些依赖模块需要被排除掉,可以使用一个exclude的选项。

      默认情况下,repackage和run这两个maven目标会包括定义在工程中的任何依赖。一些依赖被要求从可执行jar包中排除。下面有三种方式可以在包运行时排除依赖模块。

      方式1::排除一个具体的maven 模块,通过唯一的groupId和artifactId组合来实现。(如果有必要,可以加入classifier来唯一确认。)

     1 <project>
     2   ...
     3   <build>
     4     ...
     5     <plugins>
     6       ...
     7       <plugin>
     8         <groupId>org.springframework.boot</groupId>
     9         <artifactId>spring-boot-maven-plugin</artifactId>
    10         <version>1.5.6.RELEASE</version>
    11         <configuration>
    12           <excludes>
    13             <exclude>
    14               <groupId>com.foo</groupId>
    15               <artifactId>bar</artifactId>
    16             </exclude>
    17           </excludes>
    18         </configuration>
    19         ...
    20       </plugin>
    21       ...
    22     </plugins>
    23     ...
    24   </build>
    25   ...
    26 </project>
    排除一个具体的maven模块

      方式2:排除和“指定的artifactId”相符的所有maven模块。

     1 <project>
     2   ...
     3   <build>
     4     ...
     5     <plugins>
     6       ...
     7       <plugin>
     8         <groupId>org.springframework.boot</groupId>
     9         <artifactId>spring-boot-maven-plugin</artifactId>
    10         <version>1.5.6.RELEASE</version>
    11         <configuration>
    12           <excludeArtifactIds>my-lib,another-lib</excludeArtifactIds>
    13         </configuration>
    14         ...
    15       </plugin>
    16       ...
    17     </plugins>
    18     ...
    19   </build>
    20   ...
    21 </project>
    排除和指定的artifactId项目的所有maven模块

      方式3:排除属于“指定的groupId”的所有maven模块。

     1 <project>
     2   ...
     3   <build>
     4     ...
     5     <plugins>
     6       ...
     7       <plugin>
     8         <groupId>org.springframework.boot</groupId>
     9         <artifactId>spring-boot-maven-plugin</artifactId>
    10         <version>1.5.6.RELEASE</version>
    11         <configuration>
    12           <excludeGroupIds>com.foo</excludeGroupIds>
    13         </configuration>
    14         ...
    15       </plugin>
    16       ...
    17     </plugins>
    18     ...
    19   </build>
    20   ...
    21 </project>
    排除属于指定的groupId的所有maven模块

    三、重写manifest 

      这个插件还可以重写项目的manifest (可运行jar包的MANIFEST.MF),特别是管理Main-Class和Start-Class启动类。如果默认的配置不能满足需求,我们可以在这里做配置。通过插件的layout属性可以确实地控制Main-Class。

     1 <build>
     2   ...
     3   <plugins>
     4     ...
     5     <plugin>
     6       <groupId>org.springframework.boot</groupId>
     7       <artifactId>spring-boot-maven-plugin</artifactId>
     8       <version>1.5.7.RELEASE</version>
     9       <configuration>
    10         <mainClass>${start-class}</mainClass>
    11         <layout>ZIP</layout>
    12       </configuration>
    13       <executions>
    14         <execution>
    15           <goals>
    16             <goal>repackage</goal>
    17           </goals>
    18         </execution>
    19       </executions>
    20     </plugin>
    21     ...
    22   </plugins>
    23   ...
    24 </build>
    repackage mainClass

      执行打包命令:mvn package spring-boot:repackage。注意:这里不能写成mvn spring-boot:repackage。否则会报Source must refer to an existing file异常。

      layout属性默认根据archive type(jar or war)而定。总的有5中类型:

    • JAR:常规的可执行jar包的布局。
    • WAR:可执行war包的布局。
    • ZIP(和DIR一样):和使用PropertiesLauncher的jar包布局一样。
    • MODULE:包括依赖包(排除scope为provided的依赖包)和项目资源
    • NONE:包括所有的依赖包和项目资源。

    四、利用classifier分离代码包和依赖包

      当自己写项目需要发布出去给别人依赖时,就只需要自己写的代码打包,依赖的包不能打进来。否则最后别人在用你提供的包时,就会出现重复包,导致最后打包时包会非常巨大。

      在这个Spring Boot Maven Plugin这个插件下,我们只需要提供classifier即可实现这个功能。具体如下:

     1 <project>
     2   ...
     3   <build>
     4     ...
     5     <plugins>
     6       ...
     7       <plugin>
     8         <groupId>org.springframework.boot</groupId>
     9         <artifactId>spring-boot-maven-plugin</artifactId>
    10         <version>1.5.7.RELEASE</version>
    11         <executions>
    12           <execution>
    13             <goals>
    14               <goal>repackage</goal>
    15             </goals>
    16             <configuration>
    17               <classifier>exec</classifier>
    18             </configuration>
    19           </execution>
    20         </executions>
    21         ...
    22       </plugin>
    23       ...
    24     </plugins>
    25     ...
    26   </build>
    27   ...
    28 </project>
    repackage classifier

    五、打包时排除resources下的资源文件

     1 <build>
     2   ...
     3     <resources>
     4         <resource>
     5             <directory>src/main/resources</directory>
     6             <excludes>
     7                 <exclude>**/*.properties</exclude>
     8                 <exclude>**/*.xml</exclude>
     9                 <exclude>**/*.yml</exclude>
    10             </excludes>
    11         </resource>
    12     </resources>
    13     <plugins>
    14       ...
    15         <plugin>
    16             <groupId>org.springframework.boot</groupId>
    17             <artifactId>spring-boot-maven-plugin</artifactId>
    18             <executions>
    19                 <execution>
    20                     <goals>
    21                         <goal>repackage</goal>
    22                     </goals>
    23                 </execution>
    24             </executions>
    25         </plugin>
    26       ...
    27     </plugins>
    28   ...
    29 </build>
    排除resources下的资源文件

       

    喜欢请微信扫描下面二维码,关注我公众号--“精修Java”,做一些实战项目中的问题和解决方案分享。 

  • 相关阅读:
    How Many Tables 并查集(求有几个集合)
    Spell checker 字典树&&普通查找(加计数)
    昂贵的聘礼 dijstra算法(要枚举源点)
    All in All 找子串 水题
    Ultra-QuickSort 求逆序对 归并排序
    Snowflake Snow Snowflakes 根据相似度排序,有点暴力
    Gold Balanced Lineup hash函数,第一次接触,借鉴了大神的博客思想,看了很久才看懂,弱菜啦
    Stockbroker Grapevine 裸的floyd算法,求最大中的最小
    Check the difficulty of problems 概率dp,概率知识很重要
    [leetcode] Valid Anagram 、 Find All Anagrams in a String
  • 原文地址:https://www.cnblogs.com/zhouqinxiong/p/repackage.html
Copyright © 2020-2023  润新知