1. 程式人生 > >maven(三)最詳細的profile的使用

maven(三)最詳細的profile的使用

前言

       在開發過程中,我們的專案會存在不同的執行環境,比如開發環境、測試環境、生產環境,而我們的專案在不同的環境中,有的配置可能會不一樣,比如資料來源配置、日誌檔案配置、以及一些軟體執行過程中的基本配置,那每次我們將軟體部署到不同的環境時,都需要修改相應的配置檔案,這樣來回修改,很容易出錯,而且浪費勞動力。
       在前面的文章profile之springboot,springboot為我們提供了一種解決方案,而maven也提供了一種更加靈活的解決方案,就是profile功能。

1. 原理

1.1 先看一段pom檔案中的profile定義

 <profiles>
        <profile>
            <!--不同環境Profile的唯一id-->
            <id>dev</id>
            <properties>
                <!--profiles.active是自定義的欄位(名字隨便起),自定義欄位可以有多個-->
                <profiles.active>dev</profiles.active>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
        </profile>
    </profiles>

       可以看到定義了多個profile,每個profile都有唯一的id,也包含properties屬性。這裡為每個profile都定義一個名為profiles.active的properties,每個環境的值不同。當我們打包專案時,啟用不同的環境,profiles.active欄位就會被賦予不同的值
1.2 結合resource屬性
       這個profiles.active欄位可以應用到許多地方,及其靈活。可以在配置檔案裡被引用(參考此部落格);也可以結合pom檔案裡的resource和filter屬性,作為檔名的一部分或者資料夾名的一部分,下面會詳細講解這個用法。

注意:maven的profile用法有許多種,但基本原理就是根據啟用環境的不同,自定義欄位被賦予不同的值。

2. 應用演示

2.1 專案結構

在這裡插入圖片描述

       這裡定義了dev,prod,test三個資料夾,用來演示maven中profile的使用。注意,每個資料夾裡還定義了application-{xxx}.properties件,這裡相當於結合springboot的Profile的使用,是我比較推薦的方式,和本文maven的profile使用無關係,在application.properties都有spring.profiles.active=xxx去載入對應的application-{xxx}.properties。

pom檔案裡的關鍵配置為

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>true</executable>
                </configuration>
            </plugin>
        </plugins>

        <resources>
            <resource>
                <directory>src/main/resources/</directory>
                <!--打包時先排除掉三個資料夾-->
                <excludes>
                    <exclude>dev/*</exclude>
                    <exclude>prod/*</exclude>
                    <exclude>test/*</exclude>
                </excludes>
                <includes>
                    <!--如果有其他定義通用檔案,需要包含進來-->
                    <!--<include>messages/*</include>-->
                </includes>
            </resource>
            <resource>
                <!--這裡是關鍵! 根據不同的環境,把對應資料夾裡的配置檔案打包-->
                <directory>src/main/resources/${profiles.active}</directory>
            </resource>
        </resources>
    </build>

    <profiles>
        <profile>
            <!--不同環境Profile的唯一id-->
            <id>dev</id>
            <properties>
                <!--profiles.active是自定義的欄位,自定義欄位可以有多個-->
                <profiles.active>dev</profiles.active>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
            <!--activation用來指定啟用方式,可以根據jdk環境,環境變數,檔案的存在或缺失-->
            <activation>
                <!--這個欄位表示預設啟用-->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>
        </profile>
    </profiles>

可以看到我們利用resource屬性來配置打包時,根據啟用的環境來選取要打包的資料夾。我們使用maven命令

mvn clean package

prod環境被預設啟用,打包後的包結構為
在這裡插入圖片描述
可以看到prod資料夾下的配置檔案被打包進去,通過啟用不同的profile也就實現了動態切換配置檔案。

2.2 啟用方式

profile的啟用方式有很多種

1. 通過maven命令引數

即在使用maven打包時通過-P引數,-P後跟上profile的唯一id,如

mvn clean package -Ptest

打包時test的profile被啟用,打包後的包結構為:
在這裡插入圖片描述

2. 通過pom檔案裡的activation屬性

	<profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
            <!--activation用來指定啟用方式,可以根據jdk環境,環境變數,檔案的存在或缺失-->
            <activation>
                <!--配置預設啟用-->
                <activeByDefault>true</activeByDefault>
                
                <!--通過jdk版本-->
                <!--當jdk環境版本為1.5時,此profile被啟用-->
                <jdk>1.5</jdk>
                <!--當jdk環境版本1.5或以上時,此profile被啟用-->
                <jdk>[1.5,)</jdk>

                <!--根據當前作業系統-->
                <os>
                    <name>Windows XP</name>
                    <family>Windows</family>
                    <arch>x86</arch>
                    <version>5.1.2600</version>
                </os>

                <!--通過系統環境變數,name-value自定義-->
                <property>
                    <name>env</name>
                    <value>test</value>
                </property>

                <!--通過檔案的存在或缺失-->
                <file>
                    <missing>target/generated-sources/axistools/wsdl2java/
                        com/companyname/group</missing>
                    <exists/>
                </file>
            </activation>
        </profile>

       這裡我寫了多種方式,可以通過activeByDefault、jdk版本、作業系統、系統環境變數(在win10我試了不成功,win7可以,不知道為啥)、檔案的存在或缺失,實際專案可以根據需要選取一種即可。這種的優先順序低於maven命令引數指定的方式。

3. settings.xml中使用activeProfiles指定(瞭解即可)

即mave目錄下的settings.xml也可以新增下面的程式碼來指定啟用哪個profile。

<activeProfiles>  
     <activeProfile>profileTest1</activeProfile>  
</activeProfiles>  

       值得注意的是1. setting.xml在當前系統使用者的.m2資料夾有(如沒有可手動拷貝過去也會生效),針對的當前使用者的profile配置,在maven的安裝目錄下“conf/settings.xml”,針對的是全域性的profile配置。2.profile也可以定義在setting.xml檔案中,但是這種方式個人感覺並不實用的,不推薦。