SpringBoot项目打包结构分离

说明

  1. 通常情况下,SpringBoot打包生成的fat jar太大了,所有的依赖jar包都放置到fat jar里,对于多模块的应用而言,任何的改动,都需要进行整体的打包发布上线,相对于war包中直接更新WEB-INF/lib下的jar而言,显得很繁琐,因此,可以考虑使用maven-jar-plugin + maven-assembly-plugin的方式,修改SpringBoot打包的结构,从而,方便进行依赖jar的改动。另一种方式是maven-jar-plugin + maven-dependency-plugin
  2. maven-assembly-plugin插件的配置分两部分-maven插件本身的配置(plugin的configuration)、插件的额外配置(打包描述文件pkg.xml)。
  3. maven-assembly-plugin的描述符配置官方文档
  4. maven-assembly-plugin作为maven插件的配置官方文档

pom.xml的build配置–maven插件本身的配置

<build>
  <finalName>${project.artifactId}</finalName>
  <plugins>
    <!-- 一定不要使用springboot的maven插件,否则用于执行的jar仍然是很大的,依赖jar包并不会被拆分出来 -->
    <!--<plugin>-->
      <!--<groupId>org.springframework.boot</groupId>-->
      <!--<artifactId>spring-boot-maven-plugin</artifactId>-->
    <!--</plugin>-->

    <!-- 不使用springboot的打包方式,引入jar插件 -->
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>com.bjqs.test.deploy.ApiApp</mainClass><!-- 指定需要运行的main方法所在类 -->
            <classpathPrefix>lib</classpathPrefix><!-- 可以不是lib,需要与assembly的描述文件中(pkg.xml),依赖的存放位置一致即可 -->
            <addClasspath>true</addClasspath>
          </manifest>
        </archive>
      </configuration>
    </plugin>

    <!-- 引入assembly插件 -->
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
          <descriptor>src/assembly/pkg.xml</descriptor><!-- 指定自定义打包结构的描述文件位置 -->
        </descriptors>
        <finalName>${project.build.finalName}</finalName><!-- 指定最终生成的jar包的名称 -->
        <encoding>UTF-8</encoding>
      </configuration>
      <executions>
        <execution>
          <id>assembly</id>
          <goals>
            <goal>single</goal>
          </goals>
          <phase>package</phase>
        </execution>

      </executions>
    </plugin>
  </plugins>
</build>

说明

maven-assembly-plugin插件配置自定义描述文件,文件名可以随便起,位置随意,只要在descriptor节点能正确指向这个文件即可。

打包描述文件pkg.xml的配置–assembly插件的额外配置

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.6.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.6.0 http://maven.apache.org/xsd/assembly-2.6.0.xsd">

  <id>bin</id><!-- assembly的插件配置appendAssemblyId为true时,生成的jar会带这个'bin' -->
  <formats>
    <format>dir</format><!-- 打一个文件夹包,一般用于直接在开发电脑上运行 -->
    <format>zip</format><!-- zip压缩包,上传到服务器,需要unzip解压后才可以运行,内容跟dir一样-->
    <format>tgz</format><!-- tar.gz或tgz包,tar -zxf 解压 -->
  </formats>

  <includeBaseDirectory>true</includeBaseDirectory><!-- dir及压缩时是否包含基本目录 -->
  <baseDirectory>release</baseDirectory><!-- fileSets中的内容将输出到这个目录下 -->
  <fileSets><!-- 用于配置文件集,自定义打包结构的核心配置之一 -->
    <!-- 加载启停脚本 -->
    <fileSet>
      <useDefaultExcludes>true</useDefaultExcludes>
      <directory>${project.basedir}</directory>
      <outputDirectory>.</outputDirectory>
      <fileMode>0744</fileMode>
      <lineEnding>unix</lineEnding>
      <includes>
        <include>*.bat</include>
        <include>*.sh</include>
        <include>*.md</include>
        <include>*.txt</include>
      </includes>
      <filtered>true</filtered><!-- 启用过滤,则脚本中的部分${xxx}形式的表达式可以进行替换为实际值-->
    </fileSet>

    <!-- 加载配置到config --><!-- SpringBoot默认最高优先级是config下的配置 -->
    <fileSet>
      <useDefaultExcludes>true</useDefaultExcludes>
      <directory>${project.build.outputDirectory}</directory>
      <outputDirectory>config</outputDirectory>
      <lineEnding>unix</lineEnding>
      <includes>
        <include>*.yml</include>
        <include>*.xml</include>
        <include>*.txt</include>
      </includes>
    </fileSet>

    <!-- 加载打包的jar,这个jar包含了main方法,执行时,执行这个jar,由maven-jar-plugin打包生成的 -->
    <fileSet>
      <useDefaultExcludes>true</useDefaultExcludes>
      <directory>${project.build.directory}</directory>
      <outputDirectory>.</outputDirectory>
      <includes>
        <include>*.jar</include>
      </includes>
    </fileSet>
  </fileSets>

  <!-- 依赖的处理,自定义打包结构的核心配置之二 -->
  <dependencySets>
    <dependencySet>
      <outputDirectory>lib</outputDirectory><!-- 此处的文件夹路径与pom中maven-jar-plugin中classpath前缀一致即可,否则启动jar会提示ClassNotFound问题 -->
      <unpack>false</unpack><!-- 不要解压依赖jar -->
      <scope>runtime</scope><!-- 将runtime依赖复制到lib目录 -->
      <useProjectArtifact>false</useProjectArtifact><!-- 不将可执行jar复制到lib目录,默认是true -->
    </dependencySet>
  </dependencySets>

</assembly>

说明

编写好上述配置后,对工程项目或者可执行jar所在模块,执行mvn clean package或者mvn clean install等待执行完毕即可得到如下结果。

target:

├─classes
│
├─test-mgr                      			-- 最终的名称
│    └─release                  			-- 打包基础目录
│        ├─test-mgr.jar						-- 可执行jar
│        │
│        ├─config               			-- 配置存放目录
│        │   │
│        │   └─application.yml  			-- 配置文件
│        │
│        ├─lib								-- 依赖jar存放目录 
│        │   │
│        │   └─spring-boot-starter-web.jar  -- 依赖jar包
│        │
│        ├─start.sh							-- 启停脚本
│        │
│        └─README.MD						-- 说明文件
│
├─test-mgr.jar								-- mavenen-jar-plugin生成的可执行jar,包含main方法
│
├─test-mgr.zip								-- 内部是release目录的zip压缩包
│
└─test-mgr.tgz								-- 内部是release目录的tgz压缩包
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值