成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

Ali_ / 824人閱讀

摘要:從這里我們就可以看出,兩個,雖然都是包,但是內部結構是完全不同的,因此一個可以直接執(zhí)行,另一個則可以被其他項目依賴。一次打包兩個一般來說,直接打包成可執(zhí)行就可以了,不建議將作為普通的被其他的項目所依賴。

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

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

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

多了一個插件

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 個方面的功能,從插件命令就可以看出:

五個功能分別是:

build-info:生成項目的構建信息文件 build-info.properties

repackage:這個是默認 goal,在 mvn package 執(zhí)行之后,這個命令再次打包生成可執(zhí)行的 jar,同時將 mvn package 生成的 jar 重命名為 *.origin

run:這個可以用來運行 Spring Boot 應用

start:這個在 mvn integration-test 階段,進行 Spring Boot 應用生命周期的管理

stop:這個在 mvn integration-test 階段,進行 Spring Boot 應用生命周期的管理

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

打包

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

首先 mvn package 命令 對項目進行打包,打成一個 jar,這個 jar 就是一個普通的 jar,可以被其他項目依賴,但是不可以被執(zhí)行

repackage 命令,對第一步 打包成的 jar 進行再次打包,將之打成一個 可執(zhí)行 jar ,通過將第一步打成的 jar 重命名為 *.original 文件

舉個例子:

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

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

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

兩種 jar 的比較

可執(zhí)行 jar 解壓之后,目錄如下:

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

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

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

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

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

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

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

Manifest-Version: 1.0
Implementation-Title: restful
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0

注意

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

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

一次打包兩個 jar

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

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


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

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

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

好了,關于 Spring Boot 中 jar 的問題,我們就說這么多,有問題歡迎留言討論。

關注公眾號【江南一點雨】,專注于 Spring Boot+微服務以及前后端分離等全棧技術,定期視頻教程分享,關注后回復 Java ,領取松哥為你精心準備的 Java 干貨!

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.hztianpu.com/yun/75251.html

相關文章

  • Spring Boot 參考指南(開發(fā)你的第一個Spring Boot應用程序)

    摘要:開發(fā)你的第一個應用程序本節(jié)描述如何開發(fā)一個簡單的應用程序來突出了的一些關鍵特性,我們使用來構建這個項目,因為大多數(shù)都支持它。如果你希望分發(fā)一個自包含的應用程序,這可能會有問題。 11. 開發(fā)你的第一個Spring Boot應用程序 本節(jié)描述如何開發(fā)一個簡單的Hello World! web應用程序來突出了Spring Boot的一些關鍵特性,我們使用Maven來構建這個項目,因為大多數(shù)...

    Cristalven 評論0 收藏0
  • Maven詳細教程

    摘要:清理上一次執(zhí)行創(chuàng)建的文件處理資源文件編譯代碼執(zhí)行單元測試文件創(chuàng)建拷貝到本地的倉庫下面發(fā)布生成文檔將工程所有文檔生成網(wǎng)站,生成的網(wǎng)站界面默認和的項目站點類似,但是其文檔用格式寫的,目前不支持,需要用其他插件配合才能支持。 前言 本文可以幫助你加深對Maven的整體認識,不是一篇基礎文章。如果你現(xiàn)在還沒有用 Maven 跑過 HelloWorld,那么本文可能不適合你。 一、Maven簡介...

    Keagan 評論0 收藏0
  • 使用Spring實現(xiàn)上傳文件

    摘要:要使用容器上傳文件,您需要注冊一個類在中。最好不要使用內容加載應用程序的文件系統(tǒng)。允許用戶上傳文件的表單從后端提供的文件列表調整文件上傳限制配置文件上傳時,設置文件大小限制通常很有用。 本指南將指導您完成創(chuàng)建可以接收HTTP多文件上傳服務器應用程序的過程。 你要構建什么 您將創(chuàng)建一個接受文件上傳的Spring Boot Web應用程序。您還將構建一個簡單的HTML界面來上傳測試文件。 ...

    yuanzhanghu 評論0 收藏0
  • Spring Boot 參考指南(開發(fā)者工具)

    摘要:觸發(fā)器文件可以手動更新,也可以使用插件進行更新。例如,要配置重新啟動以始終使用觸發(fā)器文件,你需要添加以下屬性遠程應用程序開發(fā)工具并不局限于本地開發(fā),在遠程運行應用程序時,還可以使用幾個特性。 20. 開發(fā)者工具 Spring Boot包括一組額外的工具,這些工具可以使應用程序開發(fā)體驗變得更加愉快,spring-boot-devtools模塊可以包含在任何項目中,以提供額外的develo...

    APICloud 評論0 收藏0
  • Spring 指南(構建RESTful Web服務)

    摘要:構建服務本指南將引導你完成使用創(chuàng)建服務的過程。接下來,你將創(chuàng)建將為這些問候語提供服務的資源控制器。告訴在包中查找其他組件配置和服務,允許它找到控制器。顯示日志輸出,該服務應在幾秒內啟動并運行。 構建RESTful Web服務 本指南將引導你完成使用Spring創(chuàng)建hello world RESTful Web服務的過程。 將要構建什么 你將構建一個接受HTTP GET請求的服務: ht...

    yzzz 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<