SpringBoot(三)之打包方式
Spring Boot 提供了幾種常見的打包方式,具體取決于你的項目需求和偏好:
- JAR(可執行的JAR文件): 這是 Spring Boot 的默認打包方式。它將項目的所有依賴打包到一個可執行的 JAR 文件中,包括 Spring Boot 應用程序以及嵌入的 Tomcat 或 Jetty 等服務器。你可以通過運行
java -jar your-application.jar
來啟動應用程序。 - WAR(Web應用程序存檔): 如果你需要將 Spring Boot 應用程序部署到外部的 Servlet 容器(如 Tomcat、Jetty 或者 Wildfly),你可以打包為 WAR 文件。在這種情況下,Spring Boot 應用程序不會包含嵌入式的服務器,而是依賴于外部容器來運行。
- Executable WAR(可執行的WAR文件): 從 Spring Boot 1.4 版本開始,你可以創建一個可執行的 WAR 文件。這種方式結合了 JAR 和 WAR 的優點。它允許你在外部容器中部署 Spring Boot 應用程序,并且仍然可以像運行 JAR 文件一樣啟動它。你只需要將 WAR 文件部署到 Servlet 容器中即可。
- Executable JAR with Dependencies(帶依賴的可執行JAR文件): 有時你可能希望生成一個包含所有依賴的可執行 JAR 文件,而不是將依賴打包到 JAR 文件中。你可以使用 Maven 或 Gradle 插件來實現這一點,例如 Spring Boot Maven 插件或 Spring Boot Gradle 插件。這種方式生成的 JAR 文件會比較大,但可以更容易地與其他項目共享依賴。
以上是一些常見的 Spring Boot 打包方式,你可以根據項目需求選擇適合你的方式。
一、jar包形式
- 在 Maven 項目的
pom.xml
文件中,確保你有spring-boot-starter-parent
作為父項目,并且添加了spring-boot-maven-plugin
插件。
<project><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version></parent><dependencies><!-- 你的其他依賴 --></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
- 執行mvn clean package,這將在項目的
target
文件夾下生成一個可執行的 JAR 文件。
tips
:可跳過tests執行 mvn clean package -DskipTests
cd target
目錄下,執行java -jar生成的jar包
命令運行web項目
java -jar .\spring-boot-start-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v2.6.4)2024-05-15 11:00:26.009 INFO 19712 --- [ main] c.a.s.SpringBootStartApplication : Starting SpringBootStartApplication v0.0.1-SNAPSHOT using Java 1.8.0_261 on DESKTOP-SQBHU59 with PID 19712 (D:\practise\spring-all\spring-boot-start\target\spring-boot-start-0.0.1-SNAPSHOT.jar started by aoxiaojun in D:\practise\spring-all\spring-boot-start\target)
2024-05-15 11:00:26.011 INFO 19712 --- [ main] c.a.s.SpringBootStartApplication : No active profile set, falling back to 1 default profile: "default"
2024-05-15 11:00:27.095 INFO 19712 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 1010 (http)
2024-05-15 11:00:27.106 INFO 19712 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-05-15 11:00:27.106 INFO 19712 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.58]
2024-05-15 11:00:27.156 INFO 19712 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-05-15 11:00:27.157 INFO 19712 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1105 ms
2024-05-15 11:00:27.198 INFO 19712 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation should only be used on methods with parameters: public java.lang.String cn.axj.springbootstart.controller.TestController.test()
2024-05-15 11:00:27.447 INFO 19712 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 1010 (http) with context path ''
2024-05-15 11:00:27.453 INFO 19712 --- [ main] c.a.s.SpringBootStartApplication : Started SpringBootStartApplication in 1.761 seconds (JVM running for 2.13)
二、war包
對于那種項目需要經常更新某個文件的情況,可以將springboot項目打包成war包,便于更新某些文件,而不用打整包的形式上線。打成war后需要依賴外部的serlvet容器運行,如tomcat,jetty等。
- 修改啟動類: 需要修改 Spring Boot 應用程序的啟動類,以擴展 SpringBootServletInitializer 類,并覆蓋 configure 方法。這個類負責初始化 Servlet 容器,并加載 Spring 應用程序上下文。
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(YourSpringBootApplication.class);}}
- 修改maven配置
<packaging>war</packaging>
<dependencies><!-- 排除內嵌的容器依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency>
</dependencies>
- 執行mvn clean package
- 部署 WAR 文件: 構建成功后,WAR 文件會生成在目標文件夾下(通常是
target
目錄),你可以將生成的 WAR 文件部署到外部的 Servlet 容器中。
三、Executable WAR
可執行的war包,可以通過java -jar命令直接運行,也可以在外部容器中部署和運行
- 在 Maven 項目的
pom.xml
文件中,確保你有spring-boot-starter-parent
作為父項目,并且添加了spring-boot-maven-plugin
插件。同時,將<executable>
設置為true
。
<packaging>war</packaging>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable></configuration></plugin></plugins>
</build>
- 執行 mvn clean package
- 在可以通過java -jar 命令執行war文件。
java -jar .\target\spring-boot-start-0.0.1-SNAPSHOT.war
四、Executable JAR with Dependencies(基本不用)
Spring Boot 的可執行 JAR 文件和帶依賴的可執行 JAR 文件之間有一些區別:
- 可執行 JAR 文件: Spring Boot 的可執行 JAR 文件是指將應用程序本身和其依賴的庫(例如 Spring Boot 框架、第三方庫等)打包到一個獨立的 JAR 文件中。這個 JAR 文件包含了所有需要的類文件和資源文件,以及一個 MANIFEST.MF 文件,指定了應用程序的入口點。你可以通過運行
java -jar your-application.jar
來啟動應用程序。 - 帶依賴的可執行 JAR 文件: 帶依賴的可執行 JAR 文件是指將應用程序本身以及其依賴的所有庫打包到一個 JAR 文件中。不同之處在于,帶依賴的 JAR 文件會將所有依賴的庫直接包含在 JAR 文件中,而不是像普通的可執行 JAR 文件那樣僅包含應用程序本身的類和資源。這意味著生成的 JAR 文件會更大,因為它包含了所有依賴的庫。這種方式使得 JAR 文件更加獨立,可以更容易地與其他項目共享,并且無需依賴外部的庫。
總的來說,帶依賴的可執行 JAR 文件包含了應用程序本身和所有依賴的庫,而普通的可執行 JAR 文件只包含了應用程序本身。選擇哪種方式取決于你的項目需求和偏好,如果你希望生成一個獨立的、包含所有依賴的 JAR 文件,可以選擇帶依賴的可執行 JAR 文件;如果你希望生成一個輕量級的 JAR 文件,并且不包含依賴的庫,可以選擇普通的可執行 JAR 文件。
要配置生成帶有依賴的可執行 JAR 文件,你可以使用 Maven Assembly 插件或 Maven Shade 插件。以下是詳細的配置步驟:
使用 Maven Assembly 插件:
- 在 Maven 項目的
pom.xml
文件中,添加 Maven Assembly 插件,并配置以生成帶有依賴的可執行 JAR 文件。
<build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><!-- 主類全限定名稱--><mainClass>com.example.MainClass</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>
- 在
mainClass
元素中指定主類的完全限定名,這是可執行 JAR 文件的入口點。