一、背景
在開發過程中,我們的軟件會面對不同的運行環境,比如開發環境、測試環境、生產環境,而我們的軟件在不同的環境中,有的配置可能會不一樣,比如數據源配置、日志文件配置、以及一些軟件運行過程中的基本配置,那每次我們將軟件部署到不同的環境時,都需要修改相應的配置文件,這樣來回修改,很容易出錯,而且浪費勞動力。
maven提供了一種方便的解決這種問題的方案,就是profile功能。
二、profile簡介
profile可以讓我們定義一系列的配置信息,然後指定其激活條件。這樣我們就可以定義多個profile,然後每個profile對應不同的激活條件和配置信息,從而達到不同環境使用不同配置信息的效果。
profile定義的位置
(1) 針對於特定項目的profile配置我們可以定義在該項目的pom.xml中。(下面舉例是這種方式)
(2) 針對於特定用戶的profile配置,我們可以在用戶的settings.xml文件中定義profile。該文件在用戶家目錄下的“.m2”目錄下。
(3) 全局的profile配置。全局的profile是定義在Maven安裝目錄下的“conf/settings.xml”文件中的。
三、配置動態打包
1、配置profile
在項目的profile中添加如下的profile配置:
<profiles> <profile> <!-- 本地開發環境 --> <id>dev</id> <properties> <profiles.active>dev</profiles.active> </properties> <activation> <!-- 設置默認激活這個配置 --> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <!-- 發布環境 --> <id>release</id> <properties> <profiles.active>release</profiles.active> </properties> </profile> <profile> <!-- 測試環境 --> <id>beta</id> <properties> <profiles.active>beta</profiles.active> </properties> </profile> </profiles>
這裡定義了三個環境,分別是dev(開發環境)、beta(測試環境)、release(發布環境),其中開發環境是默認激活的(activeByDefault為true),這樣如果在不指定profile時默認是開發環境,也在package的時候顯示指定你要選擇哪個開發環境,詳情見後面。
2、配置文件
針對不同的環境,我們定義了不同的配置文件,文件目錄如下:
如圖所示,開發環境、測試環境、生產環境的配置文件分別放到src/main/resources目錄下的config文件夾下。
config下有多個環境的配置文件,命名規則為是application-環境名稱.properties。
處理過程:
1)通過profile選中你要使用的環境
2)通過package命令,將環境變量注入到application.properties中(這樣子,那些公用的環境變量就不用在各個環境的配置文件中配置了)
3)項目中加載application.xml文件
加載配置文件
<context:property-placeholder location="classpath:application.properties"/>
例子:
application-beta.properties文件有如下部分內容:
env.datasource.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&zeroDateTimeBehavior=round env.datasource.username=root env.datasource.password=12233
application.properties有部分如下內容用於注入上面的內容:
datasource.jdbcUrl=${env.datasource.jdbcUrl} datasource.username=${env.datasource.username} datasource.password=${env.datasource.password}
3、maven資源插件配置
在pom.xml的build結點下,配置資源文件的位置,如下所示:
<build> <finalName>seewo-admin</finalName> <!-- 定義了變量配置文件的地址 --> <filters> <filter>src/main/resources/config/application-${env}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> </plugin> </plugins> </build>
這裡注意一個參數<filtering>true</filtering>
,一定要設置成true.這樣才會用對應env目錄下的配置文件覆蓋原來的。
4、激活profile
1)默認的激活
上面的profile配置中設置的默認的激活環境。如下面所示
<activeByDefault>true</activeByDefault>
2)使用-P參數顯示激活一個profile
當我們在進行Maven操作時就可以使用-P參數顯示的指定當前激活的是哪一個profile了。比如我們需要在對項目進行打包的時候使用id為dev的profile,我們就可以這樣做:
mvn package –Pdev
這裡假設dev是在settings.xml中使用dev標記的處於激活狀態的profile,那麼當我們使用“-P !profile”的時候就表示在當前操作中該profile將不處於激活狀態。
5、調用
private Logger logger = LogManager.getLogger(MyApp.class.getName());
其他的使用和log4j的是一樣的。
四、遇到的坑
在application.xml文件中不能出現@關鍵字,就算你注釋了也不行。當出現@了,之後的所有環境變量將不會被注入
如:
致謝:感謝您的閱讀!