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
微信掃一掃
支付寶掃一掃