SpringBoot作為一個框架工具,不僅能夠幫助開發者快速構建應用程序,還能夠使得應用程序更加靈活運用。在實際項目開發中,將SpringBoot應用程序打成WAR包後進行部署是很常見的一種方法,本文將介紹SpringBoot WAR包部署的方法及其相關細節。
一、WAR包部署原理
WAR文件的全稱是Web Application Archive,通常也叫Web應用程序壓縮包。將這種類型的壓縮包部署到web服務器上,就可以讓web服務器來幫助我們將其解壓並運行。而SpringBoot應用程序的WAR包部署也是類似,它是將整個應用程序打包成一個壓縮包,以web應用程序的形式部署到web服務器上。
SpringBoot項目如果需要打成WAR包,需要在pom.xml文件中進行相應的配置。通常在<packaging>
節點下設置為war,如下所示:
<packaging>war</packaging>
在進行WAR包部署之前,需要先將應用程序打成一個可執行的WAR包。可以使用如下Maven指令打包:
mvn clean package
執行此指令之後,會在target目錄下生成一個*.war
的可執行WAR包。
二、WAR包部署步驟
Step1:添加SpringBoot啟動類
將SpringBoot項目打成WAR包需要在應用程序的啟動類上添加一個extends SpringBootServletInitializer
的類繼承關係,並覆寫configure方法。代碼如下:
package com.example.springbootdemo; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SpringBootDemoApplication.class); } }
其中SpringBootDemoApplication.class替換成您的SpringBoot應用程序的啟動類。
Step2:修改pom.xml文件
在之前的pom.xml文件中添加如下依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency>
這些依賴的加入是為了引入Tomcat容器以及Servlet規範API。
Step3:修改打包方式
在之前的pom.xml文件中,打包方式是jar包。要修改為war包需要更改屬性的設置,具體修改如下:
<packaging>war</packaging> ... <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Dspring.profiles.active=product</jvmArguments> </configuration> ...
在這裡將<packaging>
屬性設置為war
,然後在<build><plugins><plugin>
下面添加spring-boot-maven-plugin
插件。同時我們將在應用程序中使用profile進行配置,以便在激活時能夠根據需要獲取不同的配置文件。
Step4:打包WAR包
完成上述修改之後,使用mvn clean package
命令進行打包即可。在編譯完畢之後,會在target目錄生成一個.war
文件。
Step5:部署到Tomcat
在Tomcat的$TOMCAT_HOME/webapps
目錄下,放置新生成的WAR包。Tomcat會自動解壓,啟動該應用程序。
三、WAR包部署注意事項
1、Port衝突
在Tomcat中部署WAR包時,應該避免端口衝突。啟動Tomcat服務器並發布WAR包後,服務器可能會遇到端口佔用問題。可以在Tomcat內的server.xml文件中更改端口號解決。除此之外,SpringBoot還支持使用外部的服務端口號,可以在application.properties或application.yml中指定。
2、靜態資源訪問
在WAR包部署下,src/main/resources/static
或src/main/resources/public
中的靜態資源不再存在,會被打包進WAR包的根目錄下。所以,URL和classpath訪問這些文件時需要使用特定的相對路徑,參考下面的代碼:
http://localhost:8080/{yourAppName}/{yourResourcePath} ClassPathResource resource = new ClassPathResource("/{yourResourcePath}");
3、數據源配置
在WAR包部署下,數據源的配置需要放在/WEB-INF/classes/application.properties
或application.yml
文件中。示例如下:
#Properties spring.datasource.url=jdbc:postgresql://localhost:5432/my_db spring.datasource.username=user spring.datasource.password=pass #YAML spring: datasource: url: jdbc:postgresql://localhost:5432/my_db username: user password: pass
4、JSP頁面處理
在WAR包部署下,SpringBoot默認不支持使用JSP頁面。我們需要進行額外的配置才能使其實現。通常需要在Web項目的配置文件中,添加如下代碼:
@Bean public InternalResourceViewResolver jspViewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/jsp/"); viewResolver.setSuffix(".jsp"); return viewResolver; }
同時,也需要在application.properties/application.yml
文件中配置視圖文件的路徑,如下所示:
#Properties spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp #YAML spring: mvc: view: prefix: /WEB-INF/jsp/ suffix: .jsp
四、小結
通過本篇文章的詳細介紹,我們了解到了SpringBoot WAR包部署的整個流程,包括如何打成WAR包、如何部署和相關注意事項。希望這些內容能夠幫助您更好地了解War包部署。
最後,附上一個小例子,這個例子可以讓你更好地理解本文所講內容:
package com.example.springbootdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class SpringBootDemoApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(SpringBootDemoApplication.class); } @GetMapping("/") public String hello(){ return "hello, world!"; } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/201073.html