日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

spring boot 使用maven和fat jar/war运行应用程序的对比

發(fā)布時(shí)間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring boot 使用maven和fat jar/war运行应用程序的对比 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 簡(jiǎn)介
    • Spring Boot Maven Plugin
    • 使用Maven命令來運(yùn)行應(yīng)用程序
    • 作為fat jar/war包運(yùn)行應(yīng)用程序
    • 詳解War文件
    • 詳解jar文件
    • 如何選擇

使用maven和fat jar/war運(yùn)行應(yīng)用程序的對(duì)比

簡(jiǎn)介

上篇文章我們介紹了Spring boot的fat jar/war包,jar/war包都可以使用 java -jar 命令來運(yùn)行,而maven也提供了mvn spring-boot:run 命令來運(yùn)行應(yīng)用程序,下面我們看看兩者有什么不同。

Spring Boot Maven Plugin

上篇文章我們提到了Spring Boot Maven Plugin,通過使用該插件,可以有效的提高部署效率,并打包成為fat jar/war包。

在打包成fat jar/war包的時(shí)候,背后實(shí)際上做了如下的事情:

  • 管理了classpath的配置,這樣我們?cè)谶\(yùn)行java -jar的時(shí)候不用手動(dòng)指定-cp 。
  • 使用了自定義的ClassLoader來加載和定位所有的外部jar包依賴。并且所有的依賴jar包已經(jīng)被包含在這個(gè)fat包里面了。
  • 通過manifest自動(dòng)查找main() ,這樣我們就不需要在java -jar中手動(dòng)指定main方法。
  • 使用Maven命令來運(yùn)行應(yīng)用程序

    要使用maven命令來運(yùn)行應(yīng)用程序可以在程序的根目錄下面執(zhí)行:

    mvn spring-boot:run

    它會(huì)自動(dòng)下載所需要的依賴,并運(yùn)行,運(yùn)行日志如下:

    mvn spring-boot:run [INFO] Scanning for projects... [INFO] [INFO] -------------------< com.flydean:springboot-fatjar >-------------------- [INFO] Building springboot-fatjar 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] >>> spring-boot-maven-plugin:2.2.2.RELEASE:run (default-cli) > test-compile @ springboot-fatjar >>> [INFO] [INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ springboot-fatjar --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 0 resource [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ springboot-fatjar --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ springboot-fatjar --- [INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] [INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ springboot-fatjar --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] <<< spring-boot-maven-plugin:2.2.2.RELEASE:run (default-cli) < test-compile @ springboot-fatjar <<< [INFO] [INFO] [INFO] --- spring-boot-maven-plugin:2.2.2.RELEASE:run (default-cli) @ springboot-fatjar --- [INFO] Attaching agents: []

    作為fat jar/war包運(yùn)行應(yīng)用程序

    如果想打包成fat jar/war, 需要使用Maven Spring Boot plugin,如下所示,否則打包出來的jar包并不包含外部依賴:

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

    如果我們的代碼包含了多個(gè)main class, 需要手動(dòng)指定具體使用哪一個(gè), 有兩種設(shè)置方式:

    <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><configuration><mainClass>com.flydean.FatJarApp</mainClass></configuration></execution></executions> </plugin>

    或者設(shè)置star-class屬性:

    <properties><start-class>com.flydean.FatJarApp</start-class> </properties>

    使用 mvn clean package 即可打包程序,然后使用java -jar target/springboot-fatwar-0.0.1-SNAPSHOT.war
    即可運(yùn)行。

    詳解War文件

    將打包好的war文件解壓,我們看下War文件的結(jié)構(gòu):

    里面有三部分:

    • META-INF, 里面包含有自動(dòng)生成的MANIFEST.MF
    • WEB-INF/classes, 包含了編譯好的class文件
    • WEB-INF/lib,包含了war的依賴jar包和嵌入的Tomcat jar包。
    • WEB-INF/lib-provided,包含了embedded模式運(yùn)行所需要但是在部署模式不需要的額外的依賴包。
    • org/springframework/boot/loader,里面是Spring boot自定義的類加載器,這些類加載器負(fù)責(zé)加載外部依賴,并且使他們?cè)谶\(yùn)行時(shí)可用。

    我們?cè)倏聪翸ANIFEST.MF文件的內(nèi)容:

    Manifest-Version: 1.0 Implementation-Title: springboot-fatwar Implementation-Version: 0.0.1-SNAPSHOT Start-Class: com.flydean.FatWarApp Spring-Boot-Classes: WEB-INF/classes/ Spring-Boot-Lib: WEB-INF/lib/ Build-Jdk-Spec: 1.8 Spring-Boot-Version: 2.2.2.RELEASE Created-By: Maven Archiver 3.4.0 Main-Class: org.springframework.boot.loader.WarLauncher

    主要關(guān)注兩行:

    Start-Class: com.flydean.FatWarApp Main-Class: org.springframework.boot.loader.WarLauncher

    一個(gè)是啟動(dòng)類就是我們自己寫的,一個(gè)是main類這個(gè)是Spring boot自帶的。

    詳解jar文件

    我們?cè)賮砜聪耲ar文件:

    jar文件和war文件有一點(diǎn)不同,沒有WEB-INF,改成了BOOT-INF。

    • 我們所有的自己的class都在BOOT-INF/classes下面。
    • 外部依賴在BOOT-INF/lib下。

    我們?cè)倏聪翸ANIFEST.MF文件有什么不同:

    Manifest-Version: 1.0 Implementation-Title: springboot-fatjar Implementation-Version: 0.0.1-SNAPSHOT Start-Class: com.flydean.FatJarApp Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Build-Jdk-Spec: 1.8 Spring-Boot-Version: 2.2.2.RELEASE Created-By: Maven Archiver 3.4.0 Main-Class: org.springframework.boot.loader.PropertiesLauncher

    我們可以看到Start-Class還是一樣的,但是Main-Class是不一樣的。

    如何選擇

    既然有兩種方式來運(yùn)行應(yīng)用程序,一種是使用mvn命令,一種是使用fat jar/war文件,那我們?cè)撛趺催x擇呢?

    通常情況下,如果我們是在線下的開發(fā)環(huán)境,可以直接使用mvn命令,mvn命令需要依賴于源代碼,我們可以不斷的修改源代碼,方便開發(fā)。

    如果是在線上環(huán)境,那么我們就需要使用fat jar/war了,這樣的外部依賴比較小,我們不需要在線上環(huán)境部署maven環(huán)境,也不需要源代碼,只要一個(gè)java的運(yùn)行時(shí)環(huán)境就可以了。

    本文的代碼請(qǐng)參考https://github.com/ddean2009/learn-springboot2/tree/master/springboot-fatwar

    更多精彩內(nèi)容且看:

    • 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級(jí)賬本,以太坊,Libra,比特幣等持續(xù)更新
    • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
    • Spring 5.X系列教程:滿足你對(duì)Spring5的一切想象-持續(xù)更新
    • java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程

    更多教程請(qǐng)參考 flydean的博客

    超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

    總結(jié)

    以上是生活随笔為你收集整理的spring boot 使用maven和fat jar/war运行应用程序的对比的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。