maven 多个开发环境配置

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>
  1. 在env/ 目录下的配置的是各个环境的配置文件,我们是不需要的,我们执行把需要的copy 到指定位置 如下(4步)。
  2. 把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>
  1. 指定环境下的文件会覆盖掉目标(<targetPath></targetPath>= 默认是classpath=(<targetPath>${project.build.directory}/classes</targetPath>)下存在的同名文件
  2. ${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>
  1. 我们把公用的配置文件copy到指定位置(classpath)。
  2. 我们把指定环境的配置文件copy到指定位置(classpath)。
  3. 注意第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中的值)替换掉。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值