maven springboot 除去指定的jar包_企业都在用的 spring boot 打包插件,真的超好用

本文介绍了如何使用maven的spring-boot-maven-plugin插件将spring boot项目打包成可执行jar包,解决找不到主类的问题。同时,分享了企业常用的大数据项目打包方式,利用maven-assembly-plugin创建包含shell脚本、配置文件的标准目录结构,并排除jar中的某些配置文件,使得外部配置生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

71816e8d05d0473382746afcd180faac.gif

每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

环境说明:

springboot:2.2.7

jdk:1.8.0

maven:3.6.3

在平时的项目中,我们用到了 spring boot 默认的插件 spring-boot-maven-plugin 来进行打包,打的包是直接可执行的。但是这次,有一个多模块项目,我负责其中一个模块的开发,开发完成之后,发现打的包直接执行报找不到主类,这就有点奇怪了,所以就有了这篇文章。

让我们一起系统地总结下如何打成可执行 jar 包,另外也分享一下企业经常用的打包方式。

一、打成可执行jar包

如果你的项目工程,不能制作为可执行 jar 包,即执行 java -jar xxx.jar 报错,可以尝试下我的 pom 配置。

pom 关于打包的配置如下所示:

UTF-8

true

org.springframework.boot

spring-boot-maven-plugin

2.2.7.RELEASE

com.xxx.xxx.DataCenterProxyApplication

repackage

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

一般 spring boot 工程会自带 spring-boot-maven-plugin 这个插件,它是继承的父工程 spring-boot-starter-parent 的 spring-boot-maven-plugin 插件,父 pom 中的 spring-boot-maven-plugin 插件定义为:

f23a64fd7b4a068cda0594a32bd7fd55.png

如果在项目 pom 文件中,没有继承 spring-boot-starter-parent 的话,那么 spring-boot-maven-plugin 插件就没有了继承关系,所以只能自己手动指定主类加载,手动设置 goal 为 repackage 。

设置好以后,通过 idea 工具可以看到 maven 中包含了 spring-boot-maven-plugin 插件:

7e5b82a7bc68df791ecd97f01f65b219.png

功能说明:

  • build-info:生成项目的构建信息文件 build-info.properties
  • repackage:这个是默认 goal,在 mvn package执行之后,这个命令再次打包生成可执行的 jar,同时将mvn package生成的 jar 重命名为*.origin。
  • run:这个可以用来运行 Spring Boot 应用
  • start:这个在 mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  • stop:这个在 mvn integration-test阶段,进行Spring Boot应用生命周期的管理

打出来的可执行 jar 包,目录结构为:

093ad52915fbb37af63735813c6f0e13.png

其中 BOOT-INF 主要是一些启动信息,包含 classes 和 lib 文件,classes 文件放的是项目里生成的 class 字节文件和配置文件,lib 文件是项目所需要的 jar 依赖。

META-INF 目录下主要是 maven 的一些元数据信息,MANIFEST.MF 文件内容如下:

Manifest-Version: 1.0

Implementation-Title: spring-xxx-project

Implementation-Version: 0.0.1

Start-Class: com.example.CustomApplication

Spring-Boot-Classes: BOOT-INF/classes/

Spring-Boot-Lib: BOOT-INF/lib/

Build-Jdk-Spec: 1.8

Spring-Boot-Version: 2.2.2.RELEASE

Created-By: Maven Archiver 3.4.0

Main-Class: org.springframework.boot.loader.JarLauncher

其中 Start-Class 是项目的主程序入口,即 main 方法。Springboot-Boot-Classes 和 Spring-Boot-Lib 指向的是生成的 BOOT-INF 下的对应位置。

这样的 jar 包,我们可以直接使用 java -jar xxx.jar 命令来启动。

二、企业经常用的打包方式

其实在大数据项目中,用的打包插件以 maven-assembly-plugin居多,因为大数据项目中往往有很多 shell 脚本、sql 脚本、.properties 及 .xml 配置项等,采用 assembly 插件可以让输出的结构清晰而标准化

1、项目目录

fac16a40eb72bbc202e9d8578fd6fd37.png

2、pom 文件依赖

org.apache.maven.plugins

maven-assembly-plugin

2.5.5

utf-8

false

src/main/build/package.xml

make-assembly

package

single

3、集成过程(package.xml)

package

tar.gz

data-xxx-xxx

src/main/bin

bin

*.*

0755

unix

src/main/resources

conf

logs

logs

lib

runtime

按照以上配置打包好后,将 .tar.gz 文件上传到服务器,解压之后就会得到 bin、conf、lib 等规范化的目录结构,十分方便。

4、打包后 .tar.gz 解压后的目录

a0b1c46a090f2638044beceb586fb393.png

解压完以后,可以执行 bin 目录下的 start.sh 脚本来启动服务。启动 jar 包的命令如下:

java -Xmx800m -Xms512m -cp :/opt/xxx/lib/*:/opt/xxx/conf com.example.CustomApplication

4836d26abff249043d0002fb95b132a9.png

三、后续

但是在使用过程中,我发现修改 conf 里面的 yml 配置文件没有生效:

5e4225738d6e31b4d89c9b7e0c797983.png
5266a5ee8e765ea43a9805ba37f6183a.png

经过排查之后才发现,生成的 jar 包文件中,有相关 yml 文件,所以修改 conf 目录才会不生效。

那我们应该在打 jar 包的时候,将相关配置文件给排除掉,这样,启动的时候再指定 conf 目录就可以实时读取 conf 目录的配置了。

我们可以使用 maven-jar-plugin 插件来设置排除文件:

org.apache.maven.plugins

maven-jar-plugin

3.0.2

*.conf

*.yml

*.xml

*.properties

上述配置在打 jar 包时,就排除了 resources 目录下的 conf、yml、xml、properties 文件。

然后项目再重新打包,将生成的 jar 包替换到 lib 目录下即可。

这时候修改 conf 的配置文件后,再启动 jar 包,配置就会直接生效了。

1e64a04ed55f43da05b2ccdee87ba923.png

四、总结

1、如果需要打成可执行 jar 包的话,可以使用 spring boot 的打包插件:spring-boot-maven-plugin 。

2、不过还是推荐第二种打包方式,因为使用很方便,特点如下:

  • 可以将 jar 包操作脚本写入到 bin 目录下,方便程序的启动与停止。
  • 将配置文件与 jar 包解耦,如果需要修改配置文件(比如 application-test.yml、logback-spring.xml)的话,直接修改 conf 目录,然后重启 jar 包即可(前提是需要将 jar 包里面的配置文件给排除掉)。
  • 目录层级明显,依赖的 jar 包都在 lib 目录下。

点关注,不迷路

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才

白嫖不好,创作不易。各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

如果本篇博客有任何错误,请批评指教,不胜感激 !

朕已阅

1c3798cb1fe0883f6d36a844ea7068e5.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值