springBoot專案打war包,部署到外部tomcat;解決打包後resources下的檔案全部丟失
2018-08-29 小賴 文件初始化
springBoot 帶有內建Tomcat 伺服器,可以直接將專案打包成jar執行,但是如果在需要把專案達成war包該怎麼辦呢?下面是將springboot專案部署為war專案的一些步驟
1. pom.xml中將打包形式jar修改為war
修改前:
<packaging>jar</packaging>
修改後:
<packaging>war</packaging>
2. 移除原有內建Tomcat
將springboot內建的Tomcat依賴移除 ,需要注意的是,使用不同的模板引擎的時候,需要移除的依賴位置也不同,下面是原生的依賴和thymeleaf 模板引擎移除依賴的一些方法 (後面打包發現。 可以不需要在依賴中去除tomcat 依賴直接新增)。
# 原生Tomcat依賴移除
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId >spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope> provided</scope>
</dependency>
# thymeleaf 模板引擎依賴移除
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
新增的依賴:
<!--因配置外部TOMCAT 而配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--因配置外部TOMCAT 而配置-->
3. 設定打包後的專案訪問名稱
設定打包後的專案訪問名稱,在build節點裡設定檔名
<finalName>ROOT</finalName>
(這裡是一個特別需要注意的地方,由於開始的時候是使用的單模組程式,所以可以對專案命名,但是在多模組打包中發現,如果新增專案名稱 這個結點。打包好的程式在tomcat中執行的時候會發生錯誤,war 包的目錄格式有問題,建議finalName設定的名稱 == artifactId名稱)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>ROOT</finalName>
</build>
4. 初始化 Spring 應用上下文
由於我們需要使用外部Tomcat伺服器部署war包,所以不能使用建立專案的application.java 這個main方法了,需要重寫一個類似於 web.xml 檔案配置的方式來啟動 Spring 應用上下文,此時我們需要宣告一個類,這個類的作用與在 web.xml 中配置負責初始化 Spring 應用上下文的監聽器作用類似。
我們平常用main方法啟動的方式,都有一個App的啟動類,程式碼如下:
@SpringBootApplication
public class BootWithActivitiApplication extends WebMvcConfigurerAdapter
{
public static void main(String[] args) {
SpringApplication.run(BootWithActivitiApplication.class, args);
}
}
Application類的同級新增一個SpringBootStartApplication類,其程式碼如下:
public class SpringBootStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意這裡要指向原先用main方法執行的Application啟動類
return builder.sources(BootWithActivitiApplication.class);
}
}
5. 部署
略。
基本上到這步就算是成功了,沒有遇到下述問題可略過。
6.解決打包後resources下的檔案全部丟失
打包後resources下的檔案全部丟失,如下圖所示:
classes資料夾下只有com開頭的class檔案,resources中的配置檔案、靜態資源都沒有打包進來。
解決辦法:Application類上面的有註解@ComponentScan導致檔案丟失,去掉此註解即可。(不一定只有這一個原因,其他原因還未發現。) 網上還有另一個造成此問題
修改前:
@SpringBootApplication
@ComponentScan({"org.activiti.rest.diagram","com.spcx.activiti"})
public class BootWithActivitiApplication extends WebMvcConfigurerAdapter{
}
修改後:
@SpringBootApplication
public class BootWithActivitiApplication extends WebMvcConfigurerAdapter{
}