maven 多环境配置
修改文件《pom.xml》
1、指定环境
<profiles>
<!-- 本地开发环境 -->
<profile>
<id>dev</id>
<properties>
<package.environment>dev</package.environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>qas</id>
<properties>
<package.environment>qas</package.environment>
</properties>
</profile>
<!-- 灰度环境 -->
<profile>
<id>pre</id>
<properties>
<package.environment>pre</package.environment>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prd</id>
<properties>
<package.environment>prd</package.environment>
</properties>
</profile>
</profiles>
2、 配置各个环境文件所在目录
这样只是配置好了结构和指定好了各个环境的文件所在位置,当启动时指定的环境下的配置文件还不能使用,需要配置一个插件,当在启动时把指定的环境的配置文件copy 到《spring-context.xml》引用的位置(4步)。我的spring 指定的位置是如下配置的位置(classpath 下):
3、排出不需要的文件
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<!--1-->
<exclude>env/</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
<includes>
<!--2-->
<include>**/*.xml</include>
</includes>
</resource>
</resources>
- 在env/ 目录下的配置的是各个环境的配置文件,我们是不需要的,我们执行把需要的copy 到指定位置 如下(4步)。
- 把xml 文件打包进去(我这里是把mybatis 放到了java 下了)
4、让程序启动时把指定启动的环境配置copy到spring 属性引用位置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<escapeString>/</escapeString>
<encoding>UTF-8</encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>en</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
<executions>
<execution>
<id>copy-resources</id>
<!--在process-resources生命周期内执行-->
<phase>process-resources</phase>
<goals>
<!--goal为copy-resources-->
<goal>copy-resources</goal>
</goals>
<configuration>
<!--copy目标目录-->
<outputDirectory>target/classes</outputDirectory>
<resources>
<resource>
<!--copy资源所在的目录-->
<directory>src/main/resources/env/${package.environment}</directory>
<targetPath></targetPath>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
- 指定环境下的文件会覆盖掉目标(
<targetPath></targetPath>
= 默认是classpath=(<targetPath>${project.build.directory}/classes</targetPath>
)下存在的同名文件${package.environment}
这个变量即使上面<profile><properties>
标签中的<package.environment>
标签名,所以要改同时改掉。
6、启动命令
再贴个tomcat 插件的配置吧
<!-- tomcat7 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
tomcat7:run -Dmaven.tomcat.port=9011 -P qas
如果在配置上面tomcat7插件时指定了端口好,那么命令中
-Dmaven.tomcat.port=9011
则无效,配置中优先级高于命令参数优先级。
7、优化3、可以省略4
其实第4步是可以省去的,但是要优化3 的配置,使指定环境配置文件copy到指定位置
<resource><!--1 -->
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}/classes</targetPath>
<filtering>true</filtering>
<includes>
<include>*</include>
</includes>
</resource>
<resource><!--2-->
<directory>src/main/resources/${package.environment}</directory>
<targetPath>${project.build.directory}/classes</targetPath>
<filtering>true</filtering>
<includes>
<include>*</include>
</includes>
</resource>
- 我们把公用的配置文件copy到指定位置(classpath)。
- 我们把指定环境的配置文件copy到指定位置(classpath)。
- 注意第2步的过程不会覆盖原来位置(此处指classpath)存在的同名文件。
8、讲一下 下的标签的含义吧, 标签配置容易让人想入非非
<resources>
<resource>
<!-- 指定resources插件处理哪个目录下的资源文件 -->
<directory>src/main/resources</directory>
<!-- 打包后放在什么位置 -->
<targetPath>${project.build.directory}/classes</targetPath>
<!-- 不包含directory指定目录下的以下文件 -->
<excludes>
<exclude>pro/*</exclude>
<exclude>dev/*</exclude>
<exclude>test/*</exclude>
</excludes>
<!-- 只(这个字很重要)包含directory指定目录下的以下文件
<include>和<exclude>都存在的话,那就发生冲突了,这时会以<exclude>为准 -->
<includes>
<include></include>
</includes>
<!-- filtering为true的时候,这时只会对文件(<excludes>)中的占位符替换为真实值,
filtering为false的时候,不会把占位付替换为真实值 -->
<filtering>true</filtering>
</resource>
</resources>
. filtering 标签总会然人联想到和includes 、excludes有关系,网上搜了一些博客也是写的然人茫然,这个标签并不是对文件的限制,而是对文件内容替换变量的功能的一个开关。当为true 时会把移动过的文件中的变量用真实值(eg: *.properites中的值)替换掉。