1. 程式人生 > >將springboot web應用打包為jar

將springboot web應用打包為jar

通常情況下,對於一個 web應用,例如我們之前使用到的 hello應用,在部署的時候,我們會將其打包成一個 war包,然後部署到tomcat下面。
在使用了 SpringBoot之後,我們可以將應用打包為一個可以執行的 jar包,同樣可以執行這個應用,因為 tomcat已經內嵌在我們的程式中了,因此我們並不需要將 hello應用打成war 包,然後再部署。

通常我們將一個可以執行的 jar包稱之為fat jar 。因為這樣的 jar包內部通常包含了自己執行時的所有依賴,也就是一個大的 jar中內部包含了自己執行時所有依賴的 jar(jar包中還有jar 包),體積比較大,所以比較 fat。

要注意的是, Java並沒有提供一種標準的方式來載入“巢狀 jar”。而SpringBoot 提供了一個外掛,可以幫助我們將應用打包成一個可以執行的 jar。

在pom.xml檔案中加入:

  1. <build>
  2. <!--將應用打包成一個可以執行的 jar -->
  3. <plugins>
  4. <plugin>
  5. <groupId> org.springframework.boot </groupId>
  6. <artifactId> spring-boot-maven-plugin </artifactId>
  7. </plugin>
  8. </plugins>
  9. </build>

這段配置可以幫助我們將SpringBoot應用打包成一個可執行的jar。下面開始執行打包的操作,右擊專案名 "run as =>maven build" ,在goals 中輸入package:

Image.png

點選 run之後,我們可以target目錄下看到類似以下的檔案

Image.png

其中, springbootstudy-0.0.1-SNAPSHOT.jar是我們打包好的,內部包含了其他依賴的,可以直接執行的jar,而springbootstudy-0.0.1-SNAPSHOT.jar.original 則是原始的打包後的jar。

進入 target資料夾所在目錄,我們可以看看這兩個檔案的區別:

Image.png

第一個可以直接執行的 jar的大小為13M 左右,而第二個只有 6KB。

通過jar tvf springbootstudy-0.0.1-SNAPSHOT.jar 命令,我們可以看到這個 jar中的內容,當然更直觀的方式,你可以選擇直接右擊解壓這個 jar檔案,就會發現這個 jar的 lib目錄下,實際上存放了所有依賴的 jar。而 springbootstudy-0.0.1-SNAPSHOT.jar.original 則是沒有包含這些依賴的 jar的原始包。

我們可以通過命令 java -jar springbootstudy-0.0.1-SNAPSHOT.jar來直接執行這個jar,你將會在命令列看到和在Eclipse中直接執行quick start應用同樣的輸出內容,在瀏覽器中輸入 localhost:8080,可以看到同樣的效果。

Image.png

注意:,如果你的專案不是沒有設定 parent專案為 spring-boot-starter-parent,那麼spring-boot-maven-plugin的配置就要顯示的指定執行階段,如下所示

  1. <plugin>
  2. <groupId> org.springframework.boot </groupId>
  3. <artifactId> spring-boot-maven-plugin </artifactId>
  4. <!--如果父專案不是spring-boot-starter-parent,需要顯示指定execution-->
  5. <executions>
  6. <execution>
  7. <goals>
  8. <goal> repackage</goal>
  9. </goals>
  10. </execution>
  11. </executions>
  12. </plugin>