IDEA建立的SpringBoot專案打包成war包並部署到伺服器上
背景說明
當我們使用springboot開發時,有的時候需要打war包在外部tomcat部署,方便運維人員維護,但是修改配置檔案後重新打包給運維的時候,又需要修改一些配置這樣還是不方便維護。
環境引數
開發環境:IntelliJ IDEA 2018.2.5 x64
JDK:java version "1.8.0_144"
伺服器:Linux CentOS7
專案配置
-
步驟一
修改前
開啟pom.xml
檢視打包方式(建立專案時選擇的打包方式)
如果是war方式,請直接跳到步驟三(專案打包),如果是jar就先改成war
修改後
-
步驟二
在pom.xml
中新增一個dependency依賴(意思是tomcat是外部提供的)<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
-
步驟三
新建web.xml
(新增過的也可以跳過這一步),新建的方式有兩種,一種是直接建立資料夾和檔案,另一種是通過IDEA來建立。這裡選用第二種方法。首先點選右上角的一個資料夾圖示(Project Structure)
然後選擇Modules,點選web(如果沒有就點選左上角的加號新建一個),接著雙擊下方的Web Resource Directory中的第一項,這裡是來設定webapp
的路徑,一般是自動設定好了的,直接點ok
,然後點yes
就好了。
最後點選上面的加號新建
web.xml
這裡要注意路徑,要放到剛才建立的webapp
資料夾內。點選ok,然後再點選ok,web.xml
就建立好了。
-
步驟四
建立一個Initializer
SpringBootServletInitializer
,並重寫configure
方法。且這個類應該與專案的Application在同一級目錄下
自定義配置類實現EnvironmentPostProcessor介面
- EnvironmentPostProcessor是springboot支援動態讀取檔案的介面,實現EnvironmentPostProcessor介面覆寫postProcessEnvironment方法
- 在postProcessEnvironment方法實現讀取外部配置檔案
- 使用YamlPropertiesFactoryBean來讀取yml配置檔案,getObject()方法可以獲取Properties
Initializer
類:
package com.example.demo; 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) { //Application的類名 return application.sources(WardemoApplication.class); } }
專案打包
打包方式有兩種,一直是使用命令列方式,另一種是通過maven
來打包,同樣的,這裡採用較為簡單的第二種方式。
Maven Projects > 專案名 > Lifecycle > 雙擊package開始打包
打包成功,預設war
包路徑在專案資料夾的target
檔案內
打包時跳過測試
在properties裡面增加以下程式碼:
<skipTests>true</skipTests>
專案部署
把打包好的war
包放到tomcat
的webapps
資料夾下,然後重啟tomcat
就可以了,tomcat
會自動解壓。
注意專案啟動後訪問路徑會發生變化,如之前的訪問路徑是/hello
,那麼此時就得加上webapps
下解壓的那個專案資料夾的名字,即/專案檔名/hello
。
檢視日誌
日誌檔案預設的路徑為:tomcat目錄下的/logs/catalina.out
檔案中。
以上操作完成了war包
注意:打成war包之後,server.servlet.context-path,server.port失效
可能還有一種沒那麼多事的辦法,具體沒有嘗試
(1)把靜態檔案從resource中移出來
(2) yml檔案指定靜態資源的目錄
spring: #指定環境 profiles: active: @package.environment@ #打war時指定靜態檔案,沒有效果 resources: static-locations: /static/,/public/ mvc: static-path-pattern: /** #靜態資源對映路徑
載入外部配置檔案
刪除專案中原有resources資料夾下原有的application.properties檔案,然後進行打包釋出,如果有連線資料庫,tomcat會報錯,因為沒有指定相應的資料庫資源。
1.在tomcat裡的conf資料夾下新增進剛才刪掉的application.properties檔案
2.專案中新建config包,在該包下建立MyEnvironmentPostProcessor類實現EnvironmentPostProcessor介面,程式碼如下
import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertiesPropertySource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.support.PropertiesLoaderUtils; import java.io.File; import java.io.IOException; import java.util.Properties; public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment configurableEnvironment, SpringApplication application) { //tomcat路徑 String property = System.getProperty("catalina.home"); System.out.println("catalinahome:"+property); String path =property+ File.separator+"conf"+File.separator+"application.properties"; File file = new File(path); System.out.println("Loading local settings from : "+path); if (file.exists()) { MutablePropertySources propertySources = configurableEnvironment.getPropertySources(); Properties properties = loadProperties(file); System.out.println(properties.toString()); propertySources.addFirst(new PropertiesPropertySource("Config", properties)); } } private Properties loadProperties(File f) { FileSystemResource resource = new FileSystemResource(f); try { return PropertiesLoaderUtils.loadProperties(resource); } catch (IOException ex) { throw new IllegalStateException("Failed to load local settings from " + f.getAbsolutePath(), ex); } } }
3.在classpath定義一個META-INF資料夾然後在其下面先建spring.factories檔案,在其中指定:
MyEnvironmentPostProcessor路徑根據自己的專案自行修改
org.springframework.boot.env.EnvironmentPostProcessor=com.wyh.data_center.config.MyEnvironmentPostProcessor
4.再一次打包釋出就成功並沒有報錯了,從下圖中我們也看到了獲取了相應的資料庫資訊
連結:https://www.jianshu.com/p/baf624064540https://www.jianshu.com/p/4f700110725e
https://www.jianshu.com/p/4f700110725e