天天看點

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

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

傳統的 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-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)