关于SpringBoot打包成的可执⾏jar不能被其他项⽬依赖的
问题
⽬录
⼀、Springboot 项⽬的默认插件配置
⼆、打包
三、两种 jar 包的⽐较
四、⼀次性打包两个 jar
Spring Boot 项⽬打包成的 jar ,被其他项⽬依赖之后,总是报不到类的错误?
⼤伙有这样的疑问,就是因为还没搞清楚可执⾏ jar 和普通 jar 到底有什么区别?
⼀、Springboot 项⽬的默认插件配置
Spring Boot 中默认打包成的 jar 叫做可执⾏ jar,这种 jar 不同于普通的 jar,普通的 jar 不可以通过java -jar xxx.jar命令执⾏,
普通的 jar 主要是被其他应⽤依赖,Spring Boot 打成的 jar 可以执⾏,但是不可以被其他的应⽤所依赖,即使强制依赖,也⽆法获取⾥边的类。但是可执⾏ jar 并不是 Spring Boot 独有的,Java ⼯程本⾝就可以打包成可执⾏ jar 。
有的⼩伙伴可能就有疑问了,既然同样是执⾏mvn package命令进⾏项⽬打包,为什么 Spring Boot 项⽬就打成了可执⾏ jar ,⽽普通项⽬则打包成了不可执⾏ jar 呢?
这我们就不得不提 Spring Boot 项⽬中⼀个默认的插件配置spring-boot-maven-plugin,这个打包插件存在 5 个⽅⾯的功能,从插件命令就可以看出:
五个功能分别是:
(1)build-info:⽣成项⽬的构建信息⽂件build-info.properties
(2)repackage:这个是默认 goal,在mvn package执⾏之后,这个命令再次打包⽣成可执⾏的 jar,同时将mvn
package⽣成的 jar 重命名为*.origin
(3)run:这个可以⽤来运⾏ Spring Boot 应⽤
(4)start:这个在mvn integration-test阶段,进⾏ Spring Boot 应⽤⽣命周期的管理
(5)stop:这个在mvn integration-test阶段,进⾏ Spring Boot 应⽤⽣命周期的管理
这⾥功能,默认情况下使⽤就是 repackage 功能,其他功能要使⽤,则需要开发者显式配置。
⼆、打包
repackage 功能的作⽤,就是在打包的时候,多做⼀点额外的事情:
(1)⾸先mvn package命令对项⽬进⾏打包,打成⼀个 jar,这个 jar 就是⼀个普通的 jar,可以被其他项⽬依赖,但是不可以被执⾏
(2)repackage命令,对第⼀步打包成的 jar 进⾏再次打包,将之打成⼀个可执⾏ jar ,通过将第⼀步打成的 jar 重命名为*.original⽂件
举个例⼦:
对任意⼀个 Spring Boot 项⽬进⾏打包,可以执⾏mvn package命令,也可以直接在 IDEA 中点击package,如下:
这⾥有两个⽂件,第⼀个restful-0.0.1-SNAPSHOT.jar表⽰打包成的可执⾏ jar ,第⼆个restful-0.0.iginal则是在打包过程中,被重命名的 jar,这是⼀个不可执⾏ jar,但是可以被其他项⽬依赖的 jar。通过对这两个⽂件的解压,我们可以看出这两者之间的差异。
三、两种 jar 包的⽐较
1. admin-0.0.1-SNAPSHOT.jar 可执⾏的 jar 结构
可以看到,可执⾏ jar 中,我们⾃⼰的代码是存在于BOOT-INF/classes/⽬录下,另外,还有⼀个META-INF的⽬录,该⽬录下有⼀个MANIFEST.MF⽂件,打开该⽂件,内容如下:
Manifest-Version: 1.0
Created-By: Maven Jar Plugin 3.2.0
Build-Jdk-Spec: 14
Implementation-Title: admin
Implementation-Version: 0.0.1-SNAPSHOT
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: lo.admin.AdminApplication
Spring-Boot-Version: 2.3.4.RELEASE
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
可以看到,这⾥定义了⼀个Start-Class,这就是可执⾏ jar 的⼊⼝类,Spring-Boot-Classes表⽰我们⾃⼰代码编译后的位
置,Spring-Boot-Lib则表⽰项⽬依赖的 jar 的位置。
换句话说,如果⾃⼰要打⼀个可执⾏ jar 包的话,除了添加相关依赖之外,还需要配置META-INF/MANIFEST.MF⽂件。
这是可执⾏ jar 的结构,那么不可执⾏ jar 的结构呢?
2. admin-0.0.iginal 不可执⾏的 jar 结构
我们⾸先将默认的后缀.original除去,然后给⽂件重命名,重命名完成,进⾏解压:
解压后可以看到,不可执⾏ jar 根⽬录就相当于我们的classpath,解压之后,直接就能看到我们的代码,它也有META-
INF/MANIFEST.MF⽂件,但是⽂件中没有定义启动类等。
Manifest-Version: 1.0
Created-By: Maven Jar Plugin 3.2.0
Build-Jdk-Spec: 14
Implementation-Title: admin
Implementation-Version: 0.0.1-SNAPSHOT
注意
这个不可以执⾏ jar 也没有将项⽬的依赖打包进来。
从这⾥我们就可以看出,两个 jar ,虽然都是 jar 包,但是内部结构是完全不同的,因此⼀个可以直接执⾏,另⼀个则可以被其他项⽬依赖。
四、⼀次性打包两个 jar
⼀般来说,Spring Boot 直接打包成可执⾏ jar 就可以了,不建议将 Spring Boot 作为普通的 jar 被其他的项⽬所依赖。如果有这种需求,建议将被依赖的部分,单独抽出来做⼀个普通的 Maven 项⽬,然后
在 Spring Boot 中引⽤这个 Maven 项⽬
如果⾮要将 Spring Boot 打包成⼀个普通 jar 被其他项⽬依赖,技术上来说,也是可以的,给spring-boot-maven-plugin插件添加如下配置:
<build>
springframework jar包下载<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
配置的classifier表⽰可执⾏ jar 的名字,配置了这个之后,在插件执⾏repackage命令时,就不会给mvn package所打成的 jar 重命名了,所以,打包后的 jar 如下:
第⼀个 jar 表⽰可以被其他项⽬依赖的 jar ,第⼆个 jar 则表⽰⼀个可执⾏ jar。
到此这篇关于关于SpringBoot 打包成的可执⾏ jar不能被其他项⽬依赖的问题的⽂章就介绍到这了,更多相关SpringBoot 打包成的可执⾏ jar内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。