您的当前位置:首页正文

springboot打包插件spring-boot-maven-plugin打包机制及内部结构分析

2022-11-21 来源:步旅网
springboot打包插件spring-boot-maven-plugin打包机制及内部

结构分析

当下许多公司都会选择使⽤springboot作为服务应⽤开发框架,springboot框架提供了⼀套⾃⼰的打包机制,是通过spring-boot-maven-plugin插件来实现的。

1、spring-boot-maven-plugin引⼊pom

对于新建的⼀个springboot项⽬来说,pom中会加⼊插件:

通过idea可以看到maven中包含了spring-boot-maven-plugin插件:

功能说明:

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 应⽤⽣命周期的管理

spring-boot-maven-plugin插件默认在⽗⼯程sprint-boot-starter-parent中被指定为repackage,可以点击sprint-boot-starter-parent进⼊⽗pom进⾏查看,如下图:

如果需要设置其他属性,需要在当前应⽤的pom中进⾏设置。

2、执⾏打包命令

mvn clean package

或者通过开发⼯具如idea执⾏clean和package俩命令:

执⾏以上命令时会⾃动触发spring-boot-maven-plugin插件的repackage⽬标,完后可以在target⽬录下看到⽣成的jar,如下图:

这⾥可以看到⽣成了两个jar相关⽂件,其中common.jar是spring-boot-maven-plugin插件重新打包后⽣成的可执⾏jar,即可以通过java -jarcommon.jar命令启动。common.jar.original这个则是mvn package打包的原始jar,在spring-boot-maven-plugin插件repackage命令操作时重命名为xxx.original,这个是⼀个普通的jar,可以被引⽤在其他服务中。

3、jar内部结构

对这两个jar⽂件解压看看⾥⾯的结构差异:3.1 common.jar⽬录结构如下:

其中BOOT-INF主要是⼀些启动信息,包含classes和lib⽂件,classes⽂件放的是项⽬⾥⽣成的字节⽂件class和配置⽂件,lib⽂件是项⽬所需要的jar依赖。

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

Manifest-Version: 1.0

Implementation-Title: java-common-utilsImplementation-Version: 0.0.1-SNAPSHOT

Start-Class: com.common.util.CommonUtilsApplicationSpring-Boot-Classes: BOOT-INF/classes/Spring-Boot-Lib: BOOT-INF/lib/Build-Jdk-Spec: 1.8

Spring-Boot-Version: 2.1.9.RELEASECreated-By: Maven Archiver 3.4.0

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

其中Start-Class是项⽬的主程序⼊⼝,即main⽅法。Springboot-Boot-Classes和Spring-Boot-Lib指向的是⽣成的BOOT-INF下的对应位置。Main-Class属性值为org.springframework.boot.loader.JarLauncher,这个值可以通过设置属性layout来控制,如下:

org.springframework.boot spring-boot-maven-plugin

ZIP

com.common.util.CommonUtilsApplication

repackage

设置ZIP时Main-Class为org.springframework.boot.loader.PropertiesLauncher,具体layout值对应Main-Class关系如下:

JAR,即通常的可执⾏jar

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

WAR,即通常的可执⾏war,需要的servlet容器依赖位于WEB-INF/lib-providedMain-Class: org.springframework.boot.loader.warLauncher

ZIP,即DIR,类似于JAR

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

MODULE,将所有的依赖库打包(scope为provided的除外),但是不打包Spring Boot的任何LauncherNONE,将所有的依赖库打包,但是不打包Spring Boot的任何Launchercommon.jar之所以可以使⽤java -jar运⾏,和MANIFEST.MF⽂件⾥的配置关系密切3.2 original jar包结构

可以看到通过mvn package构建的jar是⼀个普通的jar,包含的都是项⽬的字节⽂件和⼀些配置⽂件,没有将项⽬依赖的第三⽅jar包含进来。再看下MANIFEST.MF⽂件:

Manifest-Version: 1.0

Implementation-Title: java-common-utilsImplementation-Version: 0.0.1-SNAPSHOTBuild-Jdk-Spec: 1.8

Created-By: Maven Archiver 3.4.0

其中没有包含Start-Class、Main-Class等信息,这个与可执⾏jar的该⽂件存在很多差异,⽽且⽬录结构也有很⼤差异。

⼀般对使⽤spring-boot-maven-plugin插件打出的可执⾏jar不建议作为jar给其他服务引⽤,因为可能出现访问可执⾏jar中的⼀些配置⽂件找不到的问题。如果想让构建出来的原始jar不被重新打包,可以对spring-boot-maven-plugin插件配置classifier属性,⾃定义⼀个可运⾏jar名称,这样该插件就不会对原始的jar重命名操作了。

com.common.util.CommonUtilsApplication

myexec

效果如下:

以上是对spring-boot-maven-plugin插件的打包机制和jar包结构的⼀些分析。

因篇幅问题不能全部显示,请点此查看更多更全内容