成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Boot打包成的可執行jar ,為什么不能被其他項目依賴?

開發 后端
大伙有這樣的疑問,就是因為還沒搞清楚可執行 jar 和普通 jar 到底有什么區別?今天松哥就和大家來聊一聊這個問題。

 前兩天被人問到這樣一個問題:

“松哥,為什么我的 Spring Boot 項目打包成的 jar ,被其他項目依賴之后,總是報找不到類的錯誤?”

大伙有這樣的疑問,就是因為還沒搞清楚可執行 jar 和普通 jar 到底有什么區別?今天松哥就和大家來聊一聊這個問題。

多了一個插件

Spring Boot 中默認打包成的 jar 叫做 可執行 jar,這種 jar 不同于普通的 jar,普通的 jar 不可以通過 java-jar xxx.jar 命令執行,普通的 jar 主要是被其他應用依賴, SpringBoot 打成的 jar 可以執行,但是不可以被其他的應用所依賴,即使強制依賴,也無法獲取里邊的類。但是可執行 jar 并不是 Spring Boot 獨有的,Java 工程本身就可以打包成可執行 jar 。

有的小伙伴可能就有疑問了,既然同樣是執行 mvnpackage 命令進行項目打包,為什么 Spring Boot 項目就打成了可執行 jar ,而普通項目則打包成了不可執行 jar 呢?

這我們就不得不提 Spring Boot 項目中一個默認的插件配置 spring-boot-maven-plugin ,這個打包插件存在 5 個方面的功能,從插件命令就可以看出:

五個功能分別是:

  •  build-info:生成項目的構建信息文件 build-info.properties
  •  repackage:這個是默認 goal,在 mvnpackage 執行之后,這個命令再次打包生成可執行的 jar,同時將 mvnpackage 生成的 jar 重命名為 *.origin
  •  run:這個可以用來運行 Spring Boot 應用
  •  start:這個在 mvn integration-test 階段,進行 SpringBoot 應用生命周期的管理
  •  stop:這個在 mvn integration-test 階段,進行 SpringBoot 應用生命周期的管理

這里功能,默認情況下使用就是 repackage 功能,其他功能要使用,則需要開發者顯式配置。

打包

repackage 功能的 作用,就是在打包的時候,多做一點額外的事情:

  1.  首先 mvnpackage 命令 對項目進行打包,打成一個 jar,這個 jar 就是一個普通的 jar,可以被其他項目依賴,但是不可以被執行
  2.  repackage 命令,對第一步 打包成的 jar 進行再次打包,將之打成一個 可執行 jar ,通過將第一步打成的 jar重命名為 *.original 文件

舉個例子:

對任意一個 Spring Boot 項目進行打包,可以執行 mvnpackage 命令,也可以直接在 IDEA 中點擊 package,如下 :

打包成功之后, target 中的文件如下:

這里有兩個文件,第一個 restful-0.0.1-SNAPSHOT.jar 表示打包成的可執行 jar ,第二個 restful-0.0.1-SNAPSHOT.jar.original 則是在打包過程中 ,被重命名的 jar,這是一個不可執行 jar,但是可以被其他項目依賴的 jar。通過對這兩個文件的解壓,我們可以看出這兩者之間的差異。

兩種 jar 的比較

可執行 jar 解壓之后,目錄如下:

可以看到,可執行 jar 中,我們自己的代碼是存在 于 BOOT-INF/classes/ 目錄下,另外,還有一個 META-INF 的目錄,該目錄下有一個 MANIFEST.MF 文件,打開該文件,內容如下:   

  1. Manifest-Version: 1.0  
  2.    Implementation-Title: restful  
  3.    Implementation-Version: 0.0.1-SNAPSHOT  
  4.    Start-Class: org.javaboy.restful.RestfulApplication  
  5.    Spring-Boot-Classes: BOOT-INF/classes/  
  6.    Spring-Boot-Lib: BOOT-INF/lib/  
  7.    Build-Jdk-Spec: 1.8  
  8.    Spring-Boot-Version: 2.1.6.RELEASE  
  9.    Created-By: Maven Archiver 3.4.0  
  10.    Main-Class: org.springframework.boot.loader.JarLauncher 

可以看到,這里定義了一個 Start-Class,這就是可執行 jar 的入口類, Spring-Boot-Classes 表示我們自己代碼編譯后的位置, Spring-Boot-Lib 則表示項目依賴的 jar 的位置。

換句話說,如果自己要打一個可執行 jar 包的話,除了添加相關依賴之外,還需要配置 META-INF/MANIFEST.MF 文件。

這是可執行 jar 的結構,那么不可執行 jar 的結構呢?

我們首先將默認的后綴 .original 除去,然后給文件重命名,重命名完成,進行解壓:

解壓后可以看到,不可執行 jar 根目錄就相當于我們的 classpath,解壓之后,直接就能看到我們的代碼,它也有 META-INF/MANIFEST.MF 文件,但是文件中沒有定義啟動類等。   

  1. Manifest-Version: 1.0  
  2.    Implementation-Title: restful  
  3.    Implementation-Version: 0.0.1-SNAPSHOT  
  4.    Build-Jdk-Spec: 1.8  
  5.    Created-By: Maven Archiver 3.4.0 

注意

這個不可以執行 jar 也沒有將項目的依賴打包進來。

從這里我們就可以看出,兩個 jar ,雖然都是 jar 包,但是內部結構是完全不同的,因此一個可以直接執行,另一個則可以被其他項目依賴。

一次打包兩個 jar

一般來說,Spring Boot 直接打包成可執行 jar 就可以了,不建議將 Spring Boot 作為普通的 jar 被其他的項目所依賴。如果有這種需求,建議將被依賴的部分,單獨抽出來做一個普通的 Maven 項目,然后在 Spring Boot 中引用這個 Maven 項目。

如果非要將 Spring Boot 打包成一個普通 jar 被其他項目依賴,技術上來說,也是可以的,給 spring-boot-maven-plugin 插件添加如下配置:   

  1. <build>  
  2.         <plugins>  
  3.             <plugin>  
  4.                 <groupId>org.springframework.boot</groupId>  
  5.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  6.                 <configuration>  
  7.                     <classifier>exec</classifier>  
  8.                 </configuration>  
  9.             </plugin>  
  10.         </plugins>  
  11.     </build> 

配置的 classifier 表示可執行 jar 的名字,配置了這個之后,在插件執行 repackage 命令時,就不會給 mvnpackage 所打成的 jar 重命名了,所以,打包后的 jar 如下:

第一個 jar 表示可以被其他項目依賴的 jar ,第二個 jar 則表示一個可執行 jar。

好了,關于 Spring Boot 中 jar 的問題,我們就說這么多。 

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2012-12-18 11:55:38

2021-01-14 22:17:09

PythonLinux工具

2009-07-08 15:18:00

JAR文件包jar命令

2022-04-24 11:06:54

SpringBootjar代碼

2017-02-07 20:49:15

2011-11-10 10:39:21

蘋果Siri

2023-03-08 09:48:08

SpringWAR文件JAR文件

2025-05-14 06:24:11

2023-05-29 08:43:46

SpringJava

2020-05-07 16:30:32

Spring BootJava

2022-01-11 09:59:23

Python關機程序文件

2022-05-20 08:55:02

py文件exepython

2011-09-13 17:30:41

Eclipse And

2023-12-18 09:21:22

開發靜態編譯Linux

2024-02-20 08:51:56

PythonFlask工具

2020-08-14 10:40:35

RestTemplatRetrofitJava

2009-06-10 20:44:18

netbeans 打包JAR文件

2018-01-10 13:58:20

2021-05-07 07:03:33

Spring打包工具

2024-03-08 09:34:35

JpackageJarJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费观看一级毛片 | 亚洲人免费视频 | 国产精品99久久久久久久vr | 亚洲视频三 | 正在播放国产精品 | 久久精品亚洲精品 | 玖玖玖在线 | 免费看a | 成人h视频在线观看 | 亚洲精品一区二区在线观看 | 亚洲欧美日韩中文字幕一区二区三区 | 日韩免费电影 | 91精品久久久久久久久99蜜臂 | 国产高清免费视频 | 亚洲第一天堂无码专区 | 国产一区在线免费观看视频 | 国产免费播放视频 | 黄a免费看 | 中国91av | 精品国产一区二区三区久久 | 中文字幕91 | 精彩视频一区二区三区 | 美美女高清毛片视频免费观看 | 成人在线不卡 | 久草福利 | 国产美女特级嫩嫩嫩bbb片 | 日韩欧美中文 | www.99热.com | 99色综合| 九九综合九九 | 亚洲福利av | 国产一级黄色网 | 成人免费在线观看 | 一级片在线免费播放 | 国产精品视频免费观看 | 久久久成人网 | 中文字幕精品一区 | 男人的天堂在线视频 | 国产99久久精品一区二区永久免费 | 搞黄网站在线观看 | 国产精品高 |