一、资源结构
maven工程资源结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| yerba-buena:jvwa yeshaoting$ tree src/main/resources/ src/main/resources/ ├── app-db.properties ├── app.properties ├── dev │ ├── app-db.properties │ └── app.properties ├── file │ ├── image.jpg │ └── stage6.jsp ├── log4j.properties ├── model │ └── UserMapper.xml ├── prod │ ├── app-db.properties │ └── app.properties ├── spring-beans.xml ├── spring-db.xml └── spring-mvc.xml
4 directories, 13 files
|
二、需求
服务部署时,希望针对于不同的环境,使用不同的配置文件。
针对于当前工程而言,变化的配置文件为app.properties和app-db.properties。
本地环境使用:src/main/resources/ 目录下的这二个文件。
测试环境使用:src/main/resources/dev 目录下的这二个文件。
生产环境使用:src/main/resources/prod 目录下的这二个文件。
三、解决方案
借助maven-resources-plugin插件,在pom.xml指定配置。
打包时,通过 mvn clean package -Pdev 来执行对应的环境资源拷贝工作。
具体配置如下:
1. 基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <profiles> <profile> <id>dev</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-resources</id> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.outputDirectory}</outputDirectory> <resources> <resource> <directory>src/main/resources/dev</directory> <filtering>false</filtering> </resource> </resources> </configuration> <inherited></inherited> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
|
2. 改进配置
对于上面的配置,如果有prod, dev, local三类环境的话,则需要在对应的profile节点下添加三次build的配置。我们可以观察到针对不同的环境只是directory节点内容不同而已,可以使用一个变更代替就好了。
我们在profile节点下添加properties属性,使用deploy.env
来代替不同的环境目录名。于是改进后的配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <profiles> <profile> <id>dev</id> <properties> <deploy.env>dev</deploy.env> </properties> </profile> <profile> <id>prod</id> <properties> <deploy.env>prod</deploy.env> </properties> </profile> </profiles>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>copy-resources</id> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.outputDirectory}</outputDirectory> <resources> <resource> <directory>src/main/resources/${deploy.env}</directory>
<filtering>false</filtering> </resource> </resources> </configuration> <inherited></inherited> </execution> </executions> </plugin> </plugins> </build>
|
注:对于资源拷贝问题,网上也用不少通过 maven-antrun-plugin 插件来完成资源拷贝工作,也可以参考。
四、参考文档
利用maven中resources插件的copy-resources目标进行资源copy和过滤
Copy Resources
使用maven复制配置文件
Maven 如何为不同的环境打包 —— 开发、测试和产品环境
maven copy file文件到指定目录