引子:
maven與java的聯系在今天的項目已經是不可分割的 ,但是不同的項目有各具特色的項目結構,不同的項目結構使用了不同的maven插件,想要了解一個項目的項目結構,或者自己構建一個具有成熟結構體系的項目,那么,了解到熟悉的使用maven插件那么就是勢在必行的了。
maven裝載不同環境所需的配置文件
場景:
企業及應用,擺脫不了三個環境,研發環境,測試環境,生產環境,或者灰度環境,甚至更多。不同的環境 有不同的配置,那么如何在項目發布打包時將所需的配置正確的裝載呢。
正常情況下,這些不同環境的配置放在了相似的配置文件,或者類似的包結構下。
我們會使用以下命令,來裝載不同的配置文件:
mvn clean package -P uat
以上的配置代表了我們將選擇prod下包括的相關配置文件,這依賴於pom的相關profile配置 ,實際上profile文件是由maven conf/setting.xml而來的,但這里配置的是全局變量,對於一個開發者我們往往在具體的項目里配置相關的profile,以方便在打包時選擇。
示例配置如下:
<profiles> <profile> <id>dev</id> <!-- a. _P后的參數--> <activation> <activeByDefault>true</activeByDefault> <!-- b. 表示是否默認激活 mvn clean package 加載的就是此配置下的文件--> </activation> <properties> <finalName.suffix>dev</finalName.suffix><!-- c. 最終項目包后綴--> <sysconfig.properties.file>sysconfig-dev.properties</sysconfig.properties.file> <!-- d. 選擇加載的配置,注意這並不代表打包時就使用這個配置文件了,而是聲明sysconfig.properties.file這個變量留待其他地方調用--> <ucmp.log.home>d:/app/applogs/ucmp</ucmp.log.home> <!-- 同樣是聲明變量,而不是指定文件--> </properties> </profile> <profile> <id>uat</id> <properties> <finalName.suffix>uat</finalName.suffix> <sysconfig.properties.file>sysconfig-uat.properties</sysconfig.properties.file> <ucmp.log.home>/app/applogs/ucmp</ucmp.log.home> </properties> </profile>
需要留意的是,properties 。下的文件都是變量的聲明,而不是變量的使用都是需要其他地方調用的 ,正如 properties 代表的是屬性。
關於我們聲明的這三個屬性我們分別在這三個地方指定加載,
<build> <finalName>${project.artifactId}-${finalName.suffix}-${project.version}</finalName>
<!-- 環境配置和war包分離 以外部配置為准 --> <context:property-placeholder order="1" ignore-resource-not-found="true" ignore-unresolvable="true" location="file:${CONF_PATH}/${sysconfig.properties.file}" /> <context:property-placeholder order="2" ignore-resource-not-found="true" ignore-unresolvable="false" location="classpath*:/${sysconfig.properties.file}" />
<property name="instance_name" value="${jboss.server.name:-default}" /> <property name="log_home" value="${ucmp.log.home}/${instance_name}" /> <property name="logfile_maxsize" value="100MB" />
最終打包后的結果如下
uat替換${finalName.suffix} ,sysconfig-uat.properties替換${sysconfig.properties.file}
那是否這樣就代表萬事大吉了,答案是否定的 ,這樣的我們會發現在打包時上述聲明的幾個配置文件都有打入jar包只是在spring配置階段加載了我們聲明的 ,這樣的包是不夠簡潔的。
同時在復雜的環境中我們將所有的配置變量都放入一個配置文件也是行不通的,這樣會大大降低代碼的可讀性。
關於如何與assembly結合,構建更好的包結構信息,請參考我的下篇博客:http://www.cnblogs.com/lianshan/p/7348093.html