一般的項目都會運行在不同的環境上,比如我們有本地環境、開發環境、測試環境、生產環境等等。這些不同的環境,必然有不同的配置。比如日誌級別,開發環境我們一般設置成debug,而生產環境一般設置成warn。我們肯定不希望:手動修改項目配置文件,然後纔打包發佈到不同的環境。
這個時候我們可以使用maven的profile,在pom.xml中爲不同的環境配置不同的profile。
<project>
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<zoo.url>172.17.103.107:2181</zoo.url>
<log.level>DEBUG</log.level>
</properties>
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<zoo.url>172.17.103.108:2181</zoo.url>
<log.level>INFO</log.level>
</properties>
</profile>
</profiles>
</project>
如果我們需要打本地環境的包,可以激活本地環境的profile:
如果我們需要打開發環境的包,可以激活開發環境的profile:
可以看到:我們只需要執行不同的打包腳本,就可以打出不同環境需要的包,而不需要去修改項目中的配置文件,這就是profile的作用。
那什麼是maven的資源過濾?很簡單,上面我們爲本地環境和開發環境配置了不同的profile,我們代碼怎麼去讀取這些配置的值呢?我們可以定義一個config.properties,放在src/main/resources/下面:
zoo.url=${zoo.url}
log.level=${log.level}
<build>
<!-- 替換配置文件中的數據項 start -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<!-- 替換配置文件中的數據項 end -->
</build>
如果我們激活本地環境的profile,可以看到最終構建出的config.properties內容如下:
如果我們激活開發環境的profile,可以看到最終構建出的config.properties內容如下:
通過maven的profile和資源過濾,我們只需要在不同的環境激活對應的profile,配置信息就會自動改變,不需要我們取修改項目中的代碼或者配置文件,所有變量都是定義在pom.xml中的。