1. 程式人生 > >Maven中基於POM.xml的Profile來動態切換配置資訊

Maven中基於POM.xml的Profile來動態切換配置資訊

引言: 在實際專案中,總會有若干個環境需要適配,各個環境下需要獨立一套配置資訊,該如何來簡單快捷解決此類問題呢?Maven中的profile方式將幫你快速解決此類問題。

1. Maven中的profile設定

  Maven是目前主流的專案程式碼結構管理工具和打包釋出工具,在其中提供了profile方式,可以將不同的環境下的資訊,基於profile來進行管理,所有的配置資訊放入profile之內;

大家可以把profile當作一套環境下的獨立一套配置來理解。

   示例如下, pom.xml中的配置部分內容:

<project>
<!-- 省略其他部分內容 --->
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<ab.key>testkey</ab.key>
</properties>

<build>
<filters>
<filter>src/main/resources/config/db.properties</filter>
<filter>src/main/resources/config/test.xml</filter>
</filters>
</build>
</profile>

<profile>
<id>test</id>
<properties>
<ab.key>anothertestkey</ab.key>
</properties>

<build>
<filters>
<filter>src/main/resources/config/db.properties</filter>
<filter>src/main/resources/config/test.xml</filter>
</filters>
</build>
</profile>

</profiles>
</project>
  這裡使用了ab.key來表示不同環境下的配置資訊,大家可以看到不同配置環境下的擁有相同key的值是各不相同的, testkey和anothertestkey.
  <activation>標籤下的內容標識為在基於mvn的命令操作情況下,預設的profile指定,在命令列如果沒有指定profile,則預設使用activeByDefault中設定的profile值。

2.  Profile實現配置資訊動態過濾的依賴包

    主要的plugins如下所示:

<project>
<!--這裡省略其他部分的內容 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>

<resources>
<resource>
<directory>src/main/resources</directory>
<!-- <includes>
<include>**/*</include>
</includes> -->
<filtering>true</filtering>
</resource>
</resources>
</build>
   maven-surefire-plugin, 可選元件, 外掛用來在maven構建生命週期的test phase執行一個應用的單元測試。它會產生兩種不同形式的測試結果報告。
       使用方式: 使用該外掛很簡單,使用mvn surefire:test或者mvn test都可以執行工程下的單元測試。

       結果資訊: 在工程的${basedir}/target/surefire-reports,目錄下(basedir指的是pom檔案所在的目錄)

       主頁地址: http://maven.apache.org/components/plugins/maven-surefire-plugin/

  maven-resources-plugin:  必選元件, 基於profile指定動態過濾配置資訊

        使用方式:  mvn package -P profileName (or mvn deploy etc)

        結果資訊:  將src/main/resources下的配置資訊佔位符替換為profile中指定的值

       主頁地址: http://maven.apache.org/components/plugins/maven-resources-plugin/

     關於resources節點下的資訊作用,這裡是整個resources的總開關,filtering這裡指定啟用過濾功能,否則該功能將無法正常使用。 <directory>節點設定了掃描的目錄,includes節點主要是從整體的角度設定具體的掃描目錄或者檔案;如果這裡不指定的話,可以在各個profile之中指定具體需要掃描的配置檔案,在build->filters->filter中指定特定的配置檔案, 具體資訊可以參照#1中的pom.xml示例。

   #1中的resources filter設定如下:

............
<profile>
<id>test</id>
<properties>
<ab.key>anothertestkey</ab.key>
</properties>

<build>
<filters>
<filter>src/main/resources/config/db.properties</filter>
<filter>src/main/resources/config/test.xml</filter>
</filters>
</build>
</profile>
...............
3.   profile檔案使用示例

     3.1  建立maven專案

           開啟Eclipse, 開啟File--> New--> Maven Project, 建立maven專案:

          

     填寫相應的專案groupId和artifactId資訊:

        

        點選Finish按鈕之後,建立專案成功

   3.2   專案結構以及相應的配置檔案資訊

         

       這裡我們將配置檔案test.xml和db.properties放入了src/main/resources目錄下的config中。

      同時將maven的plugins按照#1的要求配置進入pom.xml檔案中。pom.xml的具體資訊如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.test</groupId>
<artifactId>mymaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>mymaven</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>

<resources>
<resource>
<directory>src/main/resources</directory>
<!-- <includes>
<include>**/*</include>
</includes> -->
<filtering>true</filtering>
</resource>
</resources>
</build>

<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<ab.key>testkey</ab.key>
</properties>

<build>
<filters>
<filter>src/main/resources/config/db.properties</filter>
<filter>src/main/resources/config/test.xml</filter>
</filters>
</build>
</profile>

<profile>
<id>test</id>
<properties>
<ab.key>anothertestkey</ab.key>
</properties>

<build>
<filters>
<filter>src/main/resources/config/db.properties</filter>
<filter>src/main/resources/config/test.xml</filter>
</filters>
</build>
</profile>
</profiles>
</project>
   配置檔案中的資訊如下, test.xml中的內容:
<?xml version="1.0" encoding="UTF-8"?>
<info>${ab.key}</info>
 db.properties中的內容如下:
my.key2=${ab.key}
 ab.key在pom.xml中的不同profile中設定的相應值。
在pom.xml中設定了2個profile, test和dev, dev做為預設的profile。

4.  執行打包或者釋出操作,檢視打包結果

    >>  mvn clean           # 清理上次打包的結果和臨時檔案

    >> mvn package -P dev -Dmaven.test.skip=true     # 打包,忽略測試部分

   然後接入生成的target目錄,檢視classes目錄下的config, 檢視db.properties和test.xml中的內容:

  

  maven的命令執行過程資訊:

 

  然後我們就可以在打包之後的結果中,看到過濾之後的資訊了。

  在Maven中-DskipTests和-Dmaven.test.skip=true的區別如下:

   -DskipTests,不執行測試用例,但編譯測試用例類生成相應的class檔案至target/test-classes下。
   -Dmaven.test.skip=true,不執行測試用例,也不編譯測試用例類。
5.  在過程中碰到的問題以及解決辦法

  Q1:  在打包過程中,發現配置資訊,並未被正確的profile下的資訊替換掉

   How  to fix it?

         a. 檢查maven中的resources plugin是否被正確的引入, 在全域性的filtering設定是否被開啟,在build節點中的directory目錄設定是否正確。另外,在特定的profile中設定的filter路徑以及檔案是否正確等

  Q2:  在打包過程中,配置檔案被正確過濾替換了,但是配置檔案不是被複制到特定的目錄,比如config下,而是被放入了classes下的根目錄了,為什麼?

   How to fix it ?

          此類情況應是build-->resources下設定了includes資訊,include了所有的檔案或者include檔案路徑為預設值,比如下面的設定:

.....................
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
   這種情況下,將includes節點去掉,在profile中進行配置filter即可。
   Q3:  我的配置都是沒有問題,但是依然發現配置檔案中的佔位符,沒有被正確替換,問題在哪裡?

   How to fix it ?

       請檢查maven-resources-plugin是否被正確的引入到plugins的列表中。


---------------------
作者:bladestone
來源:CSDN
原文:https://blog.csdn.net/blueheart20/article/details/52838093
版權宣告:本文為博主原創文章,轉載請附上博文連結!

https://blog.csdn.net/blueheart20/article/details/52838093