profile的使用詳解


前言

在開發過程中,我們的項目會存在不同的運行環境,比如開發環境、測試環境、生產環境,而我們的項目在不同的環境中,有的配置可能會不一樣,比如數據源配置、日志文件配置、以及一些軟件運行過程中的基本配置,那每次我們將軟件部署到不同的環境時,都需要修改相應的配置文件,這樣來回修改,很容易出錯,而且浪費勞動力。

在前面的文章profile之springboot,springboot為我們提供了一種解決方案,而maven也提供了一種更加靈活的解決方案,就是profile功能。

原理

先看一段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字段就會被賦予不同的值。

結合resource屬性

這個profiles.active字段可以應用到許多地方,及其靈活。可以在配置文件里被引用(參考此博客);也可以結合pom文件里的resource和filter屬性,作為文件名的一部分或者文件夾名的一部分,下面會詳細講解這個用法。

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

應用演示

項目結構

在這里插入圖片描述

這里定義了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也就實現了動態切換配置文件。

激活方式

profile的激活方式有很多種

  1. 通過maven命令參數

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

mvn clean package -Ptest

打包時test的profile被激活,打包后的包結構為:

在這里插入圖片描述

  1. 通過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命令參數指定的方式。

  2. settings.xml中使用activeProfiles指定(了解即可)

即mave目錄下的settings.xml也可以添加下面的代碼來指定激活哪個profile。

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

值得注意的是:

  • setting.xml在當前系統用戶的.m2文件夾有(如沒有可手動拷貝過去也會生效),針對的當前用戶的profile配置,在maven的安裝目錄下“conf/settings.xml”,針對的是全局的profile配置。

  • profile也可以定義在setting.xml文件中,但是這種方式個人感覺並不實用的,不推薦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM