
傳統的 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.html2、打成 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-INF\MANIFEST.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 javastack-exec-dev.jar
1. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)