1. 程式人生 > 實用技巧 >IDEA建立的SpringBoot專案打包成war包並部署到伺服器上

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介面

  1. EnvironmentPostProcessor是springboot支援動態讀取檔案的介面,實現EnvironmentPostProcessor介面覆寫postProcessEnvironment方法
  2. 在postProcessEnvironment方法實現讀取外部配置檔案
  3. 使用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包放到tomcatwebapps資料夾下,然後重啟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/baf624064540
https://www.jianshu.com/p/4f700110725e

https://www.jianshu.com/p/4f700110725e