簡(jiǎn)言
為了減少開發(fā)人員反復(fù)修改配置惠啄,考慮在舊項(xiàng)目(非springboot)中使用 maven profile
,在此記錄下實(shí)現(xiàn)過程豆瘫。
修改記錄
之前直接使用
POM
中的<resource>
標(biāo)簽來控制文件覆蓋不穩(wěn)定铆铆,時(shí)靈時(shí)不靈。導(dǎo)致測(cè)試扩借、生產(chǎn)環(huán)境jar包內(nèi)配置文件不正確〗凡遥現(xiàn)在糾正為使用resource插件缤至,如果給讀到的讀者帶來了疑惑,請(qǐng)多諒解。由 copy-resource 改為 antrun领斥。
實(shí)現(xiàn)過程
1.profiles
在pom文件中加入profiles配置嫉到。根據(jù)項(xiàng)目的需要,我配置3個(gè)profile節(jié)點(diǎn)月洛,分別對(duì)應(yīng)開發(fā)何恶、測(cè)試和生產(chǎn)3種環(huán)境。代碼如下:
<!-- 多環(huán)境配置 -->
<profiles>
<profile>
<id>default</id>
<properties>
<package.environment.conf>src/main/filters/conf/local</package.environment.conf>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<package.environment.conf>src/main/filters/conf/test</package.environment.conf>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<package.environment.conf>src/main/filters/conf/production</package.environment.conf>
</properties>
</profile>
</profiles>
簡(jiǎn)單解釋下代碼中各個(gè)節(jié)點(diǎn):
- id節(jié)點(diǎn)自定義嚼黔,定義什么细层,使用打包命令時(shí)就用什么。如test唬涧,打包時(shí)就是用
mvn package -Ptest
疫赎。 - properties下屬子節(jié)點(diǎn)自定義,名稱自定義碎节,結(jié)合下文中的
<buile>
<resource>
使用捧搞。子節(jié)點(diǎn)多少視項(xiàng)目實(shí)際情況而定。 - activation 缺省設(shè)置狮荔,如果直接使用
mvn package
時(shí),默認(rèn)會(huì)使用defaule節(jié)點(diǎn)下的配置文件。如果不設(shè)置此節(jié)點(diǎn)乐设,那么使用打包命令時(shí)需要顯示執(zhí)行id稚晚。
加入這段代碼的目的是:在打包時(shí),將目標(biāo)環(huán)境對(duì)應(yīng)目錄下的配置文件覆蓋項(xiàng)目原有的配置文件雅采,以此來達(dá)到自動(dòng)修改文件题涨。舉例說明下,通過mvn package -Ptest
打包总滩,目標(biāo)環(huán)境為test纲堵。那么在打包的時(shí)候,會(huì)使用test定義的目錄闰渔,即src/main/filters/conf/test
席函。然后,會(huì)將該目錄下的配置文件覆蓋項(xiàng)目原有的配置文件冈涧。
2.build
定義過 profiles
后茂附,就需要定義 build
節(jié)點(diǎn)內(nèi)容了。兩者的關(guān)系就是后者調(diào)用前者督弓。
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>db/*</exclude>
<exclude>*config.properties</exclude>
<exclude>*spring.xml</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/filters</directory>
<excludes>
<exclude>conf/local/*</exclude>
<exclude>conf/production/*</exclude>
<exclude>conf/test/*</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<resources>
<resource>
<directory>${package.environment.conf}</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.1 copy-resource
下面的代碼就是對(duì) profiles
節(jié)點(diǎn)定義內(nèi)容的調(diào)用:
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<resources>
<resource>
<directory>${package.environment.conf}</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
<directory>${package.environment.conf}</directory>
配置就是打包命令中指定的profile節(jié)點(diǎn)中定義屬性的目錄营曼。舉個(gè)例子:
“mvn package -Ptest”,使用此打包命令時(shí)愚隧,會(huì)先去找對(duì)應(yīng)的profile節(jié)點(diǎn)蒂阱,即:
<profile>
<id>test</id>
<properties>
<package.environment.conf>src/main/filters/conf/test</package.environment.conf>
</properties>
</profile>
找到節(jié)點(diǎn)后,${package.environment.conf}
會(huì)引用 package.environment.conf
所定義的內(nèi)容,即:src/main/filters/conf/test
录煤。
2.2 phase
<phase>
翻譯為階段鳄厌,即在什么時(shí)候?qū)?test
環(huán)境下的文件覆蓋原來的配置文件,在這里為了保證打包時(shí)能選擇正確的配置文件妈踊,設(shè)置為打包準(zhǔn)備階段了嚎,即 prepare-package
。
2.3 outputDirectory
<outputDirectory>
就是目標(biāo)文件夾廊营,即要將src/main/filters/conf/test
目錄下的文件歪泳,放到${basedir}/src/main/resources
下,${basedir}
就是項(xiàng)目文件夾的根路徑露筒。
2.4 copy-resource 改為 antrun
項(xiàng)目背景
項(xiàng)目達(dá)成jar包后夹囚,被其他項(xiàng)目模塊引用了。所以使用 IDEA
時(shí)需要開啟 maven
委托邀窃,maven
配置才能生效荸哟,打包時(shí)間略長(zhǎng)且不能使用 JRebel
,給開發(fā)帶來不便瞬捕。所以根據(jù)實(shí)際需要改為使用 antrun
插件的 copy
來達(dá)到相同的目的鞍历。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>prepare-copy-resources</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<copy file="${package.environment.conf}/spring-application.xml" tofile="${basedir}/target/classes/spring-application.xml" overwrite="true" />
<copy file="${package.environment.conf}/config.properties" tofile="${basedir}/target/classes/config.properties" overwrite="true" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
結(jié)語
至此,項(xiàng)目工程打包時(shí)肪虎,通過指定profile自動(dòng)修改配置文件的目的已經(jīng)實(shí)現(xiàn)劣砍。