欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于SpringBoot 打包成的可執(zhí)行jar不能被其他項目依賴的問題

 更新時間:2020年10月27日 15:17:04   作者:南淮北安  
這篇文章主要介紹了關于SpringBoot 打包成的可執(zhí)行jar不能被其他項目依賴的問題,本文給大家通過圖文實例相結合給大家分享解決方法,需要的朋友可以參考下

Spring Boot 項目打包成的 jar ,被其他項目依賴之后,總是報找不到類的錯誤?

大伙有這樣的疑問,就是因為還沒搞清楚可執(zhí)行 jar 和普通 jar 到底有什么區(qū)別?

一、Springboot 項目的默認插件配置

Spring Boot 中默認打包成的 jar 叫做 可執(zhí)行 jar,這種 jar 不同于普通的 jar,普通的 jar 不可以通過 java -jar xxx.jar 命令執(zhí)行,

普通的 jar 主要是被其他應用依賴,Spring Boot 打成的 jar 可以執(zhí)行,但是不可以被其他的應用所依賴,即使強制依賴,也無法獲取里邊的類。但是可執(zhí)行 jar 并不是 Spring Boot 獨有的,Java 工程本身就可以打包成可執(zhí)行 jar 。

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

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

在這里插入圖片描述
在這里插入圖片描述

五個功能分別是:

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

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

二、打包

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

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

舉個例子:
對任意一個 Spring Boot 項目進行打包,可以執(zhí)行 mvn package 命令,也可以直接在 IDEA 中點擊 package ,如下 :

在這里插入圖片描述

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

三、兩種 jar 包的比較

1. admin-0.0.1-SNAPSHOT.jar 可執(zhí)行的 jar 結構

在這里插入圖片描述

可以看到,可執(zhí)行 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: org.yolo.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,這就是可執(zhí)行 jar 的入口類,Spring-Boot-Classes 表示我們自己代碼編譯后的位置,Spring-Boot-Lib 則表示項目依賴的 jar 的位置。

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

這是可執(zhí)行 jar 的結構,那么不可執(zhí)行 jar 的結構呢?

2. admin-0.0.1-SNAPSHOT.jar.original 不可執(zhí)行的 jar 結構

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

在這里插入圖片描述

解壓后可以看到,不可執(zhí)行 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

注意

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

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

四、一次性打包兩個 jar

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

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

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <classifier>exec</classifier>
      </configuration>
    </plugin>
  </plugins>
</build>

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

在這里插入圖片描述

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

到此這篇關于關于SpringBoot 打包成的可執(zhí)行 jar不能被其他項目依賴的問題的文章就介紹到這了,更多相關SpringBoot 打包成的可執(zhí)行 jar內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Java如何創(chuàng)建Annotation

    詳解Java如何創(chuàng)建Annotation

    在本文中,我們將介紹注解的基礎知識,包括注解是什么,它們如何在示例中使用,以及如何處理它們。下面和小編一起來學習吧
    2019-05-05
  • 解決java調用dll報Unable to load library錯誤的問題

    解決java調用dll報Unable to load library錯誤的問題

    這篇文章主要介紹了解決java調用dll報Unable to load library錯誤的問題。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Myeclipse鏈接Oracle等數(shù)據(jù)庫時lo exception: The Network Adapter could not establish the connection

    Myeclipse鏈接Oracle等數(shù)據(jù)庫時lo exception: The Network Adapter coul

    今天小編就為大家分享一篇關于Myeclipse鏈接Oracle等數(shù)據(jù)庫時lo exception: The Network Adapter could not establish the connection,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Spring Cloud Gateway + Nacos 實現(xiàn)動態(tài)路由

    Spring Cloud Gateway + Nacos 實現(xiàn)動態(tài)路由

    這篇文章主要介紹了Spring Cloud Gateway + Nacos 實現(xiàn)動態(tài)路由的方法,幫助大家實現(xiàn)路由信息的自動更新,感興趣的朋友可以了解下
    2020-10-10
  • SpringBoot項目中@Test不出現(xiàn)可點擊運行的按鈕問題

    SpringBoot項目中@Test不出現(xiàn)可點擊運行的按鈕問題

    這篇文章主要介紹了SpringBoot項目中@Test不出現(xiàn)可點擊運行的按鈕問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • RocketMQ保證消息的有序性的案例分享

    RocketMQ保證消息的有序性的案例分享

    Apache RocketMQ 是一個常用的開源消息中間件,它提供了強大的有序消息處理能力,這里我們會探討 RocketMQ 是如何保證消息的有序性的,包括其設計原理和相關的源碼實現(xiàn),需要的朋友可以參考下
    2024-04-04
  • ES多條件查詢寫法舉例

    ES多條件查詢寫法舉例

    這篇文章主要給大家介紹了關于ES多條件查詢的相關資料,Elasticsearch多條件查詢是指在查詢數(shù)據(jù)時,可以同時使用多個條件來篩選數(shù)據(jù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • springboot項目中添加自定義日志及配置過程

    springboot項目中添加自定義日志及配置過程

    這篇文章主要介紹了springboot項目中添加自定義日志,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • java提取字符串中數(shù)字string以及獲取字符串中的整數(shù)或小數(shù)

    java提取字符串中數(shù)字string以及獲取字符串中的整數(shù)或小數(shù)

    這篇文章主要給大家介紹了關于java提取字符串中數(shù)字string以及獲取字符串中的整數(shù)或小數(shù)的相關資料,需要的朋友可以參考下
    2023-08-08
  • java使用任務架構執(zhí)行任務調度示例

    java使用任務架構執(zhí)行任務調度示例

    在Java 5.0之前啟動一個任務是通過調用Thread類的start()方法來實現(xiàn)的,5.0里提供了一個新的任務執(zhí)行架構使你可以輕松地調度和控制任務的執(zhí)行,并且可以建立一個類似數(shù)據(jù)庫連接池的線程池來執(zhí)行任務,下面看一個示例
    2014-01-01

最新評論