我正在参与掘金创作者训练营第5期,点击了解活动详情
1. 项目产物结构
使用 Springboot 框架开发 Java 项目时,最终项目部署前通常需要将项目进行打包,SpringBoot 中通常使用 Maven 工具来完成打包操作。
对于使用 Maven 打包产生的项目产物,在不同的情况下则会有不同需求,如:
- 将所有代码相关文件打包为 jar 包,使用命令直接执行文件即可启动服务
- 文件和依赖分开,分为 jar 包和 /lib 下的依赖包信息,避免 jar 过大传输速度太慢
- 配置文件剥离,可以动态修改配置,分为 jar、/lib、.proerties 三个文件
对于以上不同的需求,可以分别学习一下使用 Maven 如何配置达到上述要求。
2. SpringBoot 默认打包方式
SpringBoot 中 Maven 默认的方式,打包结果只含有项目本身的代码,打 jar 包时,只有在类路径上的文件资源会被打包到jar中,并且文件名是 ${artifactId}-${version}.jar
,如果想要执行打包文件,则还需要带上相关依赖包。
2.1 打包文件名称
SpringBoot 项目使用 Maven 打包后的 Jar 包产物命名方式是由项目的 pom.xml 文件定义的,其中的项目 id 和版本信息共同组成打包文件名称。
如果想要自定义生成文件名,可以修改项目属性或者在 pom.xml 的 build 标签中使用 finalName 标签自定义生成 jar 包名称。
2.2 产物信息
产物文件夹 /target
中文件有 demo.jar
和 demo.jar.original
,其他文件夹则包含了项目源文件、编译后的文件、maven 相关信息以及测试和报告等信息。
demo.jar.original
:项目的Jar包,只包含当前项目文件,不包括依赖信息demo.jar
:项目完整Jar包,包括相关依赖信息,可以直接执行
2.3 默认 Maven 打包配置
- SpringBoot 2.6.4
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
- 其中
maven-resources-plugin
是在默认配置打包报错时添加的配置项
2.4 产物文件结构
- 对应 SpringBoot 默认配置下的打包产物结构
3. 依赖文件外置
有些情况下,项目的依赖 jar 包比较多但是改动较少,在打包项目时就需要将三方依赖和当前项目分离开来,代码改变时只需要重新打包项目内容即可。
SpringBoot 默认的配置并不能实现依赖项外置,需要借助 Maven 的 maven-jar-plugin
插件和 maven-dependency-plugin
插件完成。
<build>
<plugins>
<!-- 将自己的项目代码打包成jar文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- 指定包含的依赖文件位置 -->
<classpathPrefix>lib/</classpathPrefix>
<!--指定启动类-->
<mainClass>com.domoment.leaves.LeavesApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 将依赖的jar文件全部放到lib目录下,会创建 lib 目录,将第三方依赖赋值到 lib 目录下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 其中,
maven-jar-plugin
插件用来配置当前项目 jar 包的配置,如三方依赖引用的路径信息、启动类等 maven-dependency-plugin
插件则用来配置将项目的三方依赖放置在指定目录下,并配合maven-jar-plugin
完成项目启动时的依赖
4. 配置文件外置
有些时候只是需要改动配置文件,而不需要修改源代码,因此配置文件放在 jar 文件外,会更方便。
此时可以在打包时将配置文件等内容移出产物 jar 包,并采用资源配置将配置文件复制到产物指定路径下。
<build>
<resources>
<!-- 把配置文件放到根目录和 jar 在一起 -->
<resource>
<!-- 具体的脚本放置位置可以改,不一定是当前目录 . 代表当前目录-->
<directory>src/main/resources</directory>
<includes>
<include>*.yml</include>
<include>*.properties</include>
</includes>
<targetPath>${project.build.directory}</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- 用于生成jar包的plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!--将配置文件排除掉,不打包到jar文件内-->
<excludes>
<exclude>*.properties</exclude>
<exclude>**/*.properties</exclude>
<exclude>*.yml</exclude>
<exclude>*.conf</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<resources>
标签配置指定资源操作spring-boot-maven-plugin
配置打包同时输出 demo.jar 单文件和 demo-exec.jar 整合依赖的文件,可以选择使用maven-jar-plugin
插件中可以设置打包时 jar 包中排除指定的配置文件类型