1. 程式人生 > >跟我學springboot(二十)springboot-maven配置不同打包環境

跟我學springboot(二十)springboot-maven配置不同打包環境

1.Spring Profile

Spring可使用Profile決定程式在不同環境下執行情況,包含配置、載入Bean、依賴等。
Spring的Profile一般專案包含:dev(開發), test(單元測試), qa(整合測試), prod(生產環境)。由spring.profiles.active屬性決定啟用的profile。
SpringBoot的配置檔案預設為 application.properties(或yaml,此外僅以properties配置為說明)。不同Profile下的配置檔案由application-{profile}.properties管理,同時獨立的 Profile配置檔案會覆蓋預設檔案下的屬性。

2.Maven Profile

Maven同樣也有Profile設定,可在構建過程中針對不同的Profile環境執行不同的操作,包含配置、依賴、行為等。
Maven的Profile由 pom.xml 的標籤管理。每個Profile中可設定:id(唯一標識), properties(配置屬性), activation(自動觸發的邏輯條件), dependencies(依賴)等。
每個專案都會有多套執行環境(開發,測試,正式等等),不同的環境配置也不盡相同(如jdbc.url),藉助Jenkins和自動部署提供的便利,我們可以把不同環境的配置檔案單獨抽離出來,打完包後用對應環境的配置檔案替換打包後的檔案,其實maven已經給我們提供了替換方案:profile + filtering

Filtering

Filtering 是 maven 的 resource 外掛 提供的功能,作用是用環境變數、pom檔案裡定義的屬性和指定配置檔案裡的屬性替換屬性(*.properties)檔案裡的佔位符(${jdbc.url}),具體使用如下:
在src/main/resources目錄有個配置檔案jdbc.properties,內容如下:

jdbc.url=${pom.jdbc.url}
jdbc.username=${pom.jdbc.username}
jdbc.passworkd=${pom.jdbc.password}

配置 resource 外掛,啟用filtering功能並新增屬性到pom:

<project>
    ...
    <!-- 用pom裡定義的屬性做替換 -->    
    <properties>
        <pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/dev</pom.jdbc.url>
        <pom.jdbc.username>root</pom.jdbc.username>
        <pom.jdbc.password>123456</pom.jdbc.password>
    </properties>
    <build>
      ...
        <!-- 可以把屬性寫到檔案裡,用屬性檔案裡定義的屬性做替換 -->
        <filters>
            <filter>src/main/filters.properties</filter>
        </filters>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
          </resource>
        </resources>
        ...
    </build>
    ...
</project>

編譯包後target目錄下的jdbc.properties:
jdbc.url=jdbc:mysql://127.0.0.1:3306/dev
jdbc.username=root
jdbc.passworkd=123456

Profile 簡介

什麼是profile?就像一樣是pom檔案裡的一個xml元素,在profile裡幾乎可以定義所有在pom裡的定義的內容(,,外掛配置等等,不過不能再定義他自己了)。當一個profile被啟用時,它定義的,等就會覆蓋掉原pom裡定義的相同內容,從而可以通過啟用不同的profile來使用不同的配置。

<!-- profile 的感性認識 -->
<project>
    ...
    <profiles>
      <profile>
        <id>dev</id>
        <properties>
            <active.profile>dev</active.profile>
            <pom.jdbc.url>jdbc:mysql://127.0.0.1:3306/dev</pom.jdbc.url>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>3.2.4.RELEASE</version>
            </dependency>
        <dependencies>
      </profile>
    </profiles>
    <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
    </dependencies>
    ...
</project>

Profile 如何配置
可以在兩個位置配置profile:settings.xml 和 pom.xml

settings.xml裡定義的profile是全域性的,對所有的專案都可用,在裡面定義的配置項也稍微少了些,只能定義遠端伺服器的資訊和屬性資訊(,, )。這些資訊在pom.xml裡也是可以定義的。

pom.xml裡可以定義的配置如下:

<repositories>

<pluginRepositories>

<dependencies>

<plugins>

<properties>

<modules>

<reporting>

<dependencyManagement>

<distributionManagement>

以及build下的:

<defaultGoal>

<resources>

<testResources>

<finalName>

如果profile被啟用,profile裡的配置和原pom的配置會做覆蓋合併。

如何啟用Profile

可以通過多種方式啟用profile(顯式的,隱式的)
顯式的啟用
通過maven 的-P引數啟用指定的profile,引數的值是profile的id,多個profile以逗號分割,如果不想啟用某個預設的profile,就在它的id前加個!

mvn -U clean package -Ptest,local,!ignore

IDEA裡則可以在 Maven Projects 裡直接勾選想要啟用的profile
隱式的啟用
配置profile時,可以在 的 元素下配置隱式啟用的資訊。
預設啟用
pom.xml檔案裡

<!-- 預設啟用 -->
<profiles>
  <profile>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
  </profile>
</profiles>

settings.xml檔案裡則是通過來配置預設啟用的profile列表

<activeProfiles>
    <activeProfile>artifactory</activeProfile>
</activeProfiles>

根據作業系統型別啟用

<profiles>
    <profile>
        <activation>
            <os>
                <!-- 不必指定所有資訊 -->
                <name>linux</name>
                <family>unix</family>
                <arch>amd64</arch>
                <version>3.19.0-30-generic</version>
            </os>
      </activation>
    </profile>
</profiles>

根據JDK版本啟用

<!-- 如果jdk的版本為1.8則啟用該profile -->
<profiles>
  <profile>
    <activation>
      <jdk>1.8</jdk>
    </activation>
    </profile>
</profiles>

等等很多方法。

3.Maven 管理 Spring Profile

由於構建是基於Maven(或Gradle,此處僅以Maven說明)。所以使用Maven管理Spring構建時的Profile是非常方便的。
Maven管理Spring Profile分五步,以下詳細介紹。
3.1 去掉預設的 Tomcat依賴
在SpringBoot MVC專案中,預設以內嵌Tomcat執行,如果需要特殊的設定或者使用Undertow,需要去掉預設的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>

如果你同時使用了 MyBatis,需要去掉tomcat-jdbc依賴:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3.2 Maven Profile設定
在專案(如果有模組為具體模組)的pom.xml下設定:

<!-- Maven控制Spring Profile -->
<profiles>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <profileActive>dev</profileActive>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <profileActive>prod</profileActive>
        </properties>
    </profile>
</profiles>

從上面的配置可以看出,Maven的Profile配置了兩個:dev和prod,並且在dev中使用了內嵌Tomcat,而 prod 中沒有,所以這兩個Profile打包的檔案dev可以直接執行(Plugin使用了SpringBoot Plugin),而prod並不能直接執行(或部署在外部Tomcat下,並不推薦這樣,後面會說明)。
properties中的profileActive是我們申明的屬性,此處對應Spring的Profile值。
3.3 Maven資源過濾
SpringBoot的 Profile選擇需要在 application.properties中配置,如果定死在檔案,那麼每次打包都需要手動修改,很麻煩,而且容易出錯。
Maven的資源過濾功能可以實現在構建時修改以“@[email protected]”表示的屬性。資源過濾需要在pom.xml的標籤下配置 resources:

<!-- profile對資源的操作 -->
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>application*.properties</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <!-- 是否替換@[email protected]表示的maven properties屬性值 -->
        <filtering>true</filtering>
        <includes>
            <include>application.properties</include>
            <include>application-${profileActive}.properties</include>
        </includes>
    </resource>
</resources>

上面的第一個resource去掉了src/main/resources下的所有application*.properties檔案,“*”是萬用字元,表示此處有任何內容(沒有也可以)都匹配。
第二個resource添加了application.properties預設配置檔案和由profileActive屬性決定的相應profile配置檔案。並且filtering為true表示,會將檔案內容的“@[email protected]”替換為相應的變數(如檔案中的@[email protected]會替換為profileActive屬性值)。
3.4 Spring配置Profile
在application.properties預設配置檔案中配置:

[email protected]@

@[email protected]表示該屬性值會在maven構建時被替換掉。
3.5 構建
構建命令:

mvn clean package -Pdev

上面的命令會根據Maven Profile的 dev構建環境包,如果需要prod包,則把-P的引數替換成prod即可。
常用maven命令如下回顧:

mvn -v

顯示maven安裝版本資訊

mvn clean

清理專案打包檔案,即專案下的target目錄

mvn compile

編譯專案下的src/main/Java目錄原始碼

mvn package

專案打包,在專案target目錄下生成編譯後的jar或war等檔案

mvn install

專案打包併發布到本地倉庫

mvn deploy

專案打包併發布到遠端倉庫

mvn test

單元測試命令,執行src/test/java/下的junit的單元測試用例

mvn site

生成專案相關資訊的網站

mvn eclipse:eclipse

將專案轉化eclipse專案

mvn dependency:tree

打印出專案的整個依賴關係樹

mvn archetype:generate

建立一個maven普通java專案

mvn tomcat:run

在tomcat容器中執行web應用,需要在pom檔案中配置tomcat外掛

mvn jetty:run

在jetty容器中執行web應用,需要在pom檔案中配置jetty外掛

命令引數

-D 傳入屬性引數

-P 使用指定的profile配置

-e 顯示maven執行時的報錯資訊

-o 離線本地式執行命令,不去遠端倉庫更新包

-X 顯示maven允許的debug資訊

-U 強制遠端更新,否則預設每天只更新一次

比如-D的使用:mvn package -Dmaven.test.skip=true,即打包的時候跳過單元測試,install、deplay命令都可以使用。

可以輸入mvn -h獲取更多命令的幫助。

為了方便我會在每個專案下生成一個build.sh檔案,內容如下:

#!/bin/bash

profileActive=prod
if [ -n "$1" ]; then
    profileActive=$1
fi

mvn clean package -Dmaven.test.skip=true -P$profileActive

該指令碼接收一個引數,即打包對應的Profile。預設情況下如果不帶引數,會打包prod環境包。
需要注意的是,該命令跳過了測試。
4. 總結

完成了上面的五步,即可使專案根據你的構建引數的不同,打包出不同環境下執行的包。

第1步去掉了SpringBoot內嵌的tomcat和tomcat-jdbc。使得我們可以決定在什麼情況下使用何種容器執行我們的專案。
第2步配置了Maven構建Porfile,使得構建可根據我們的指令分發不同的包。
第3步配置了Maven資源過濾,不僅使得不同Profile下的資原始檔互不可見,且替換了資原始檔中以“@[email protected]”表示的屬性值。
第4步使Spring的Profile由Maven決策,這樣,我們就不用每次打包都修改Spring的Profile配置了。
第5步展示瞭如何執行不同Profile下的構建命令,並且使用了一個Shell指令碼方便我們執行構建和跳過測試(多數時候我們在構建專案時先測試,並不需要在構建時測試,測試和構建的解耦使得我們更專注。但同時,如果你忘記了前置測試,也可能會引發未察覺的測試問題)。

相關推薦

springbootspringboot-maven配置不同打包環境

1.Spring Profile Spring可使用Profile決定程式在不同環境下執行情況,包含配置、載入Bean、依賴等。 Spring的Profile一般專案包含:dev(開發), test(單元測試), qa(整合測試), prod(生產環境)。由s

SpringBoot學習-SpringBoot整合Freemarker

基本步驟 新增pom依賴 在application.yml中新增相關配置 建立freemarker模板 建立控制層 測試訪問 新增pom依賴 <!-- springboot整合f

springbootspringboot-過濾器之攔截不需要走過濾器的連結使用方法

1.建立專案 springboot怎麼建立不多說了,前面部落格已經有講解,下面是我們建立好的專案目錄。 2.編寫程式碼 過濾器可以指定我們排除的引數exclusions,我們把需要隔離的url統一封裝在這裡,然後在webconfig配置filterReg.ad

Java程式設計師從笨鳥到菜鳥之jquery愛之初體驗jquery

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

oracle18c】第八天:Multitenant Architecture:2.3 Application root,pdb,Container Maps專項測試對應例項實踐

                         對映表指定元資料鏈接的公共表中的一列,並使用分割槽將不同的應用程式PDBs與不同的列值關聯起來。通過這

oracle18c】第七天:Multitenant Architecture多租戶框架:2.2 Overview of Commonality in the CDB藍色感悟

在CDB中,每個使用者、角色或物件都是通用的或本地的。類似地,通常或區域性授予特權. This section contains the following topics: About Commonality in a CDB A common phenomenon defined i

oracle18c】第六天:Multitenant Architecture多租戶框架:2.1 Overview of Containers in a CDB藍色感悟

容器是多租戶容器資料庫(CDB)中的模式、物件和相關結構的集合。在CDB中,每個容器都有唯一的ID和名稱 This section contains the following topics: The CDB Root and System Container The CDB

企業分布式微服務雲SpringCloud SpringBoot mybatis 整合 beatlsql

方法 wid min pos suffix put art 快速 dex 整合階段 由於springboot沒有對 beatlsql的快速啟動裝配,所以需要我自己導入相關的bean,包括數據源,包掃描,事物管理器等。 在application加入以下代碼: @Bean(i

java基礎重點講解,看了還不會找

  視訊下載地址:https://download.csdn.net/download/xxf_is_girl_gad/10886817   ###20.01_IO流(IO流概述及其分類) * 1.概念     * IO流用來處理裝置之間

Redis17—Redis事務詳解及例項

前面有篇文章,簡單介紹了Redis事務。 Redis事務主要命令包括 MULTI、EXEC、WATCH 命令。本篇文章將詳細介紹事務以及Redis事務例項應用! 一、事務、悲觀鎖、樂觀鎖概述 簡單的

彙編暫存器和實體地址的形成

一、通用暫存器 對於一個彙編程式設計師來說,CPU中主要部件是暫存器。暫存器是CPU中程式設計師可以用指令讀寫的部件。程式設計師通過改變各種暫存器的內容來實現對CPU的控制。 不同的CPU,暫存器的個數、結構是不同的。8086CPU 有14個暫存器,每個暫存

JAVA5圖形化介面設計——佈局管理器之FlowLayout流式佈局

一、佈局管理器所屬類包 所屬類包 佈局管理器名稱 說明 Java.awt FlowLayout(流式佈局) 元件按照加入的先後順序按照設定的對齊方式從左向右排列,一

程式設計3

        很多人做軟體開發非常執著於技術本身,希望通過更少的程式碼解決最多的需求,這個想法本身是沒有錯的,但是應該有一個前提,就是程式碼的可維護性比程式碼的簡潔性重要。        如下面一段程式碼:            void   swap(int *x, i

程式設計5

    編寫軟體,一個工具總是包含幾個部分:    1)編寫原始碼的編輯器,是用來寫字的,就如一張紙,其目的是讓程式編寫者更加容易書寫程式,一般具有高亮度顯示關鍵字功能。我們也可以直接用任何不帶格式的文字編輯器書寫程式碼,用office-word一樣可以書寫程式,只是儲存時

SpringCloud SpringBoot mybatis 分散式微服務Spring Boot 自定義配置檔案

上面介紹的是我們都把配置檔案寫到application.yml中。有時我們不願意把配置都寫到application配置檔案中,這時需要我們自定義配置檔案,比如test.properties:com.forezp.name=forezp com.forezp.age=12怎麼將

springboot乾貨——整合rocketmq

本篇主要講springboot如何整合rocketmq,具體的rocketmq相關知識可以檢視我的rocketmq相關專欄:RocketMQ菜鳥進化系列 1.專案結構 2.pom.xml 這邊主要是加入了mq的jar包 <dependency>  

的openwrt學習筆記:WIFI 無線傳輸速率測試-iperf

Iperf是一個TCP/IP和UDP/IP的效能測量工具,能夠提供網路吞吐率資訊,以及震動、丟包率、最大段和最大傳輸單元大小等統計資訊;從而能夠幫助我們測試網路效能,定位網路瓶頸。 現在ubuntu單虛擬機器不同終端以及不同虛擬機器之間的測試為例說明如何安裝以及使用,然後提

用戶管理命令

useadd userdel groupadd用戶管理命令:useradd,usermod,userdel,chage,groupadd,groupdel,groupmod,newgrp,gpasswd20.1.useradd功能:添加新用戶或更新新用戶信息語法: useradd 選項 用戶名常用參數:-u:

全棧JavaScript之路 HTML5 插入 html標記 insertAdjacentHTML

ava html ace erb class 之前 一個 chrom asc insertAdjacentHTML(), 這種方法也是在IE中最早出現的。如今已納入html5規範,它接受兩個參數,一個是下列的標記之中的一個,一個是要寫入的 html 代碼文本。

selenium測試Java--關閉窗口

中文 next() rgs cat [] int con cnblogs stack quit方法:退出相關的驅動程序和關閉所有窗口 close方法:關閉當前窗口 package com.test.closewindow; import java.util.Iterat