maven-assembly-plugin打包Spring-Boot工程

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命令执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,247评论 6 543
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,520评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,362评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,805评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,541评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,896评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,887评论 3 447
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,062评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,608评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,356评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,555评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,077评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,769评论 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,175评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,489评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,289评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,516评论 2 379

推荐阅读更多精彩内容