美文网首页
maven-assembly-plugin打包Spring-Bo

maven-assembly-plugin打包Spring-Bo

作者: 侧身打腿 | 来源:发表于2021-12-14 17:43 被阅读0次

Spring-Boot工程打包

结合maven相关插件,实现如下打包目标:

  • 开发代码和依赖库分离
  • 配置文件分离

1. 目标

  • 开发代码和依赖库分离
  • 配置文件分离

2. 背景

Spring-Boot工程默认采用spring-boot-maven-pluginspringboot-maven-plugin)插件进行打包。该插件会将开发代码、依赖库以及静态文件全部打包至一个jar包中,官方称该jar包为fat jar
该jar包本质是一个压缩文件,可以通过解压工具打开,其目录结构如下:

|-- BOOT-INF
|   |-- classes         开发的类及配置文件等
|   |-- classpath.idx
|   `-- lib             依赖库
|-- META-INF
|   |-- MANIFEST.MF
|   `-- maven
`-- org
    `-- springframework

2.1. 优缺点

采用默认方式的优点很明显就是简单。
由于所有文件都在一个jar中,在某些场景下也存在一些不足。首先就是由于包含依赖,该jar体积会较大,即使不再调整依赖每次上线也得重新将依赖推至生产服务器;另外,由于配置文件包含在jar中,对于运维来说不太友好。

3. 解决方法

结合使用如下maven插件:

  • maven-jar-plugin
  • maven-dependency-plugin
  • maven-assembly-plugin

:后文所有插件的配置均在pom.xml的build -> plugins标签下

3.1. 工程目录约定

假设工程目录结构如下:

|-- README.md
|-- pom.xml
|-- src
|   `-- main
|       |-- bin         保存启停脚本
|       |-- build       保存构建配置(assembly插件配置)
|       |-- java        java代码
|       `-- resources   资源文件
|           `-- config  配置文件目录
`-- dist                最终打包产物输出目录(maven-assembly-plugin)

3.2. 插件配置

3.2.1. maven-jar-plugin配置

maven-jar-plugin官方文档

功能:将开发的代码打包为jar。同时将类路径添加前缀,因为后续会将依赖位置会在此jar的同级的lib目录中。

pom.xml配置maven-jar-plugin部分:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifest>
                <!--启动类-->
                <mainClass>pengchen.demo.App</mainClass>
                <!--添加类路径前缀,因为最终的依赖包会放在lib目录下-->
                <classpathPrefix>lib</classpathPrefix>
                <addClasspath>true</addClasspath>
            </manifest>
        </archive>
        <excludes>
            <!--避免将配置文件打包到开发代码生成的jar中-->
            <!--assembly会将config目录打包到输出物的根目录下-->
            <exclude>config/**</exclude>
        </excludes>
    </configuration>
</plugin>

3.2.2. maven-dependency-plugin配置

maven-dependency-plugin官方文档

功能:将依赖包打包至lib目录中。

pom.xml配置maven-dependency-plugin部分:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.2.0</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <!-- 将依赖放到target/lib目录下 -->
                <outputDirectory>target/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

3.2.3. maven-assembly-plugin配置

maven-assembly-plugin官方文档

功能:将配置文件、启动脚本、依赖包及开发代码的jar放到合适的位置并对开发代码生成的jar包按指定规则命名,最终将所有文件添加到压缩包。

pom.xml配置maven-assembly-plugin部分:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <descriptors>
             <!--指定assembly配置文件位置-->
            <descriptor>src/main/build/assembly.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>bundle</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

assembly.xml配置(src/main/build/assembly.xml):

<assembly>
    <id>bundle</id>
    <formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>

    <fileSets>
        <!-- 启停脚本 -->
        <fileSet>
            <directory>${basedir}/src/main/bin</directory>
            <includes>
                <include>*.sh</include>
            </includes>
            <outputDirectory>${file.separator}bin</outputDirectory>
        </fileSet>
        <!-- 配置文件 -->
        <fileSet>
            <directory>${basedir}/target/classes/config</directory>
            <outputDirectory>${file.separator}config</outputDirectory>
        </fileSet>

        <!-- 依赖库 -->
        <fileSet>
            <directory>${basedir}/target/lib</directory>
            <includes>
                <include>*.jar</include>
            </includes>
            <outputDirectory>lib</outputDirectory>
        </fileSet>
        <!-- 可执行的jar -->
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>${project.artifactId}-${project.version}.jar</include>
            </includes>
        </fileSet>
    </fileSets>

</assembly>

3.3. 打包步骤

mvn package

3.4. 输出物说明

在工程dist目录下会生成一个.tar.gz文件,这便是我们最终的产出物。
解压后目录结构如下:

|-- assembly-with-springboot-demo-1.0-SNAPSHOT.jar  开发代码生成的jar包
|-- bin                                   启停脚本目录  
|   `-- run.sh
|-- config                                配置文件目录
|   `-- application.properties
`-- lib                                   依赖库目录
    |-- jackson-annotations-2.11.4.jar
    ...                                   其他依赖包

3.4. 运行

采用此种方式配置不影响IDE中原来的运行方式。针对打包后代码的运行也是直接通过java -jar命令执行。

相关文章

网友评论

      本文标题:maven-assembly-plugin打包Spring-Bo

      本文链接:https://www.haomeiwen.com/subject/qykyfrtx.html