使用maven和fat jar/war運行應用程序的對比java
上篇文章咱們介紹了Spring boot的fat jar/war包,jar/war包均可以使用 java -jar 命令來運行,而maven也提供了mvn spring-boot:run 命令來運行應用程序,下面咱們看看二者有什麼不一樣。git
上篇文章咱們提到了Spring Boot Maven Plugin,經過使用該插件,能夠有效的提升部署效率,並打包成爲fat jar/war包。github
在打包成fat jar/war包的時候,背後實際上作了以下的事情:spring
要使用maven命令來運行應用程序能夠在程序的根目錄下面執行:springboot
mvn spring-boot:run
它會自動下載所須要的依賴,並運行,運行日誌以下:maven
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, 須要使用Maven Spring Boot plugin,以下所示,不然打包出來的jar包並不包含外部依賴:ide
<build> <plugins> ... <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> ... </plugins> </build>
若是咱們的代碼包含了多個main class, 須要手動指定具體使用哪個, 有兩種設置方式:spring-boot
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <configuration> <mainClass>com.flydean.FatJarApp</mainClass> </configuration> </execution> </executions> </plugin>
或者設置star-class屬性:ui
<properties> <start-class>com.flydean.FatJarApp</start-class> </properties>
使用 mvn clean package 便可打包程序,而後使用java -jar target/springboot-fatwar-0.0.1-SNAPSHOT.war
便可運行。spa
將打包好的war文件解壓,咱們看下War文件的結構:
裏面有三部分:
咱們再看下MANIFEST.MF文件的內容:
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
主要關注兩行:
Start-Class: com.flydean.FatWarApp Main-Class: org.springframework.boot.loader.WarLauncher
一個是啓動類就是咱們本身寫的,一個是main類這個是Spring boot自帶的。
咱們再來看下jar文件:
jar文件和war文件有一點不一樣,沒有WEB-INF,改爲了BOOT-INF。
咱們再看下MANIFEST.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是不同的。
既然有兩種方式來運行應用程序,一種是使用mvn命令,一種是使用fat jar/war文件,那咱們該怎麼選擇呢?
一般狀況下,若是咱們是在線下的開發環境,能夠直接使用mvn命令,mvn命令須要依賴於源代碼,咱們能夠不斷的修改源代碼,方便開發。
若是是在線上環境,那麼咱們就須要使用fat jar/war了,這樣的外部依賴比較小,咱們不須要在線上環境部署maven環境,也不須要源代碼,只要一個java的運行時環境就能夠了。
本文的代碼請參考https://github.com/ddean2009/learn-springboot2/tree/master/springboot-fatwar
更多教程請參考 flydean的博客