为了满足项目在不同环境中的配置要求,我们在发版时要十分注意资源文件的配置,如果配置复杂就会容易出错。这里可以使用maven的中的filter和profile来解决这个问题。
首先展示已经配置好pom文件(profiles和build)
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
<envlog>test</envlog>
</properties>
</profile>
<profile>
<id>produce</id>
<properties>
<env>produce</env>
<envlog>produce</envlog>
</properties>
<activation>
<!--默认启用的是dev环境配置 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<filters>
<filter>src/main/filters/db-${env}.properties</filter>
<filter>src/main/filters/log-${envlog}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
详细解释:
目的:希望在打包时通过一个标记来告诉maven用某个过滤文件去替换配置文件
过滤文件(以测试环境为例) db-test.properties
jdbc.connection.url=testurl
jdbc.connection.username=testusername
jdbc.connection.password=testpassword
配置文件 db.properties
jdbc.connection.url=${jdbc.connection.url}
jdbc.connection.username=${jdbc.connection.username}
jdbc.connection.password=${jdbc.connection.password}
图1
原理:打包的时候maven读取build标签下的信息:
finalName表示今后打包的包名,注意现在maven要求写成project.artifactId,不能省掉project.
filters表示过滤器,也就是你若干环境的配置文件,图1中src/main/filters下面的文件(注意filters文件的位置,不要乱放)
resources表示资源文件存在的位置 <filtering>true</filtering> 表示对这个文件开启过滤器
例如maven读到 <filter>src/main/filters/db-${env}.properties</filter> 就会根据mvn命令中的 -P 来了解用户要使用那个profile,例如-P produce 那么就会把文件名称替换为src/main/filters/db-produce.properties,然后就去filter文件夹下找这个文件,最终去替换resource下的文件,resource文件夹下的文件入上面提到的db.properties一样里面的value是${xxx}这种形式表示,maven会根据xxx去filter下文件中的key去替换的
要注意的是:如果resource中有多个properties文件,多个文件中还有相同的key,maven替换时会把同名的key的value都替换掉,所以切记多个properties文件中的key一定不要一样,否则后果很严重