Spring Boot 怎麼打一個可執行 Jar 包?

  • 2019 年 10 月 30 日
  • 筆記

傳統的 Java 應用程序都需要打一個 war 包,併到到 Tomcat webapps 目錄下運行。

Java 支持打 Jar 包,但沒有提供一個標準的方式在一個 Jar 包內再加載嵌入別的 Jar 包,一般需要擴展類加載器來實現,即使這樣,也做不到打成一個包運行,因為沒有 Servlet 容器。

有了 Spring Boot 框架之後,這一切都變得簡單,我們可以很方便的將應用程序打成一個可執行 Jar 包。

怎麼打成 Jar 包運行?

1、添加插件

<plugin>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-maven-plugin</artifactId>      <executions>          <execution>              <goals>                  <goal>repackage</goal>              </goals>              <configuration>                  <classifier>exec-${env}</classifier>              </configuration>          </execution>      </executions>  </plugin>

這裡是添加了一個 Maven 打包插件,通過配置可以定製打成的 Jar 包的格式,如:javastack-exec-dev.jar。

如果你是用的 spring-boot-starter-parent 方式來使用 Spring Boot,那就不用寫 executions 選項,因為它包括了 executions repackage 構建配置。

這個插件的更多用法參考:

https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/maven-plugin/usage.html

2、打成 Jar 包

使用 mvn package 命令或者 IDE 中的 Maven 插件都可以打包。Maven 不熟悉的請關注Java技術棧微信公眾號,在後台回復:maven,乾貨棧長我都整理好了。

打完包之後,在項目 target 目錄就可以看到打成的 Jar 包。

這個 Jar 包除了包括編譯完的 class 文件,還內置了 Servlet 容器,並集成了所有需要依賴的其他 Jar 包庫,我們來看下這個 Jar 包的目錄結構。

├─BOOT-INF  │  ├─classes  │  │  └─cn  │  │      └─javastack  │  │          └─demo  │  └─lib  ├─META-INF  │  └─maven  │      └─cn.javastack  │          └─demo  └─org      └─springframework          └─boot              └─loader                  ├─archive                  ├─data                  ├─jar                  └─util

在文件 META-INFMANIFEST.MF 中找到應用程序啟動類:

Manifest-Version: 1.0  Archiver-Version: Plexus Archiver  Built-By: javastack  Start-Class: cn.javastack.demo.Application  Spring-Boot-Classes: BOOT-INF/classes/  Spring-Boot-Lib: BOOT-INF/lib/  Spring-Boot-Version: 2.1.3.RELEASE  Created-By: Apache Maven 3.5.0  Build-Jdk: 1.8.0_151  Main-Class: org.springframework.boot.loader.JarLauncher

3、運行 Jar 包

運行命令格式:

$ java -jar xxx.jar

這個命令的更多用法請看這篇文章:Java Jar包的壓縮、解壓使用指南,或者關注Java技術棧微信公眾號,在後台回復:java。

運行命令演示:

$ java -jar javastack-exec-dev.jar

.   ____          _            __ _ _   /\ / ___'_ __ _ _(_)_ __  __ _      ( ( )___ | '_ | '_| | '_ / _` |       \/  ___)| |_)| | | | | || (_| |  ) ) ) )    '  |____| .__|_| |_|_| |___, | / / / /   =========|_|==============|___/=/_/_/_/   :: Spring Boot ::  (v2.1.3.RELEASE)  ....... . . .  ....... . . . (log output here)  ....... . . .  ........ Started Example in 2.536 seconds (JVM running for 2.864)

好了,跑起來了。更多運行 Spring Boot 的方法看這篇文章:運行 Spring Boot 應用的 3 種方式!

好了,今天的分享就到這裡,更多 Spring Boot 文章正在撰寫中,關注Java技術棧微信公眾號獲取第一時間推送。

在公眾號後台回復:boot,還能獲取棧長整理的往期 Spring Boot 教程,都是實戰乾貨,以下僅為部分預覽。

  • Spring Boot 讀取配置的幾種方式
  • Spring Boot 如何做參數校驗?
  • Spring Boot 最核心的 25 個註解!
  • Spring Boot 2.x 啟動全過程源碼分析
  • Spring Boot 2.x 新特性總結及遷移指南
  • ……

未完,棧長將陸續分享 Spring Boot 最新技術教程,現在已經寫了一堆存貨了,關注微信公眾號 "Java技術棧" ,公眾號第一時間推送!

– END –

推薦閱讀:

1、代碼寫成這樣,老夫無可奈何!

2、厲害了,淘寶千萬並發,14 次架構演進…

3、面試官問線程安全的List,看完再也不怕了

4、JDK 13 的 12 個新特性,真心漲姿勢了

5、分享一份 2019 最新 Java 架構師學習資料

在後台回復:Java,可獲取一份棧長整理的最新Java 技術乾貨。

點擊https://mp.weixin.qq.com/s/flzGIy5QHqs2VN_bu5__ag?scene=25#wechat_redirect

和棧長學更多~