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

【轉載:https://blog.csdn.net/blueheart20/article/details/52838093】apache

1. Maven中的profile設置maven

  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.ui

  <activation>標籤下的內容標識爲在基於mvn的命令操做狀況下,默認的profile指定,在命令行若是沒有指定profile,則默認使用activeByDefault中設定的profile值。url

2.  Profile實現配置信息動態過濾的依賴包spa

    主要的plugins以下所示:.net

  <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的列表中。

相關文章
相關標籤/搜索