maven 在设计之初就考虑到了业务代码和测试代码的分开存放。将业务代码默认存放在 src/main 下,将测试代码放在 src/test 下,然后在各自目录下再细分 java 与 resources 。
但是我们日常开发过程中的业务代码也需要运行在不同的环境中,如开发环境、测试环境及线上环境,而不同环境之中程序的配置是不同的。每次打包完了手动替换显然不是我们想要的,所以我们希望能找一个方法,能在代码打包的时候能自动根据环境来打包不同的配置文件。
还好, maven-resources-plugin 支持自定义配置文件的路径,找到一个解决问题的入口。
首先,我们在工程里面建立多个文件夹,如图:
而在 pom.xml 里面这样配置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>org.kischn</groupId> 8 <artifactId>multi-profile</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 12 <profiles> 13 <!-- 当我们需要把代码打包发布到生产环境时,执行 mvn clean package -D skipTests -P production --> 14 <profile> 15 <id>production</id> 16 <build> 17 <resources> 18 <resource> 19 <directory>src/main/prod-resources</directory> 20 </resource> 21 <resource> 22 <directory>src/main/resources</directory> 23 </resource> 24 </resources> 25 </build> 26 </profile> 27 </profiles> 28 </project>
maven-resources-plugin 支持自定义多个 resource 目录,嘻嘻,不错~
啥?没看到 maven-resources-plugin 相关的名字?因为 maven 默认就带这个插件呀,只填上这个相关的配置就可以了。
经过我的测试, maven-resources-plugin 的配置文件复制的策略就是 按照配置的顺序进行文件拷贝,如果冲突呢?冲突就是不覆盖。
所以, xml 里面配置的意思就是先把 prod-resources 里面的文件复制到 target 目录下,然后再复制 resources 里面的,如果冲突了, resources 里面的文件就不复制了。
测试一下效果:
好,大功告成!
总结一下其中的关键点:
0. maven-resources-plugin 支持自定义多个 resources 目录,且目录是按照声明顺序进行文件复制,如果文件遇到冲突,靠前的优先存在。
1. 也就是说你可以理解为 prod-resources 继承 resources,如果 prod-resources 里面有与 resources 同名文件,说明就是 override 了,否则就直接继承 resources 里面的文件了。
上面提到的 multi-profile 代码灰常简单,点击这里下载 multi-profile.zip