Maven 整合 spring profile实现多环境自动切换

时间:2014-03-19 15:32来源:Internet 作者:Internet 点击:525次
profile主要用在项目多环境运行的情况下,比如开发环境、测试环境、线上生产环境。 我负责的项目某个数据管理后台涉及到包含测试环境在内的12个不同的运行环境,所以每次发布都很蛋疼很纠结,配置改过来改

profile主要用在项目多环境运行的情况下,比如开发环境、测试环境、线上生产环境。 
我负责的项目某个数据管理后台涉及到包含测试环境在内的12个不同的运行环境,所以每次发布都很蛋疼很纠结,配置改过来改过去,到最后有些环境都忘了怎么配的。 
下面以这个项目为例介绍。 
准备条件:spring3.x、Maven 2 

这里是整合spring的profile和Maven的profile功能 

spring的profile配置 

首先是spring的配置数据源和属性文件 

<beans profile="xmj_old">
        <bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url"
                value="jdbc:mysql://127.0.0.1:3306/db1?characterEncoding=utf8" />
            <property name="password" value="123456" />
            <property name="username" value="abc" />
        </bean>
        <bean id="messageSource"
            class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <property name="basenames">
                <list>
                    <value>classpath:messages_zh_CN</value>
                    <value>classpath:messages/messages_en_US-xmj_old</value>
                </list>
            </property>
        </bean>
    </beans>
    <beans profile="xmj_new">
        <bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url"
                value="jdbc:mysql://127.0.0.1:3306/db1?characterEncoding=utf8" />
            <property name="password" value="123456" />
            <property name="username" value="abc" />
        </bean>
        <bean id="messageSource"
            class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <property name="basenames">
                <list>
                    <value>classpath:messages_zh_CN</value>
                    <value>classpath:messages/messages_en_US-xmj_new</value>
                </list>
            </property>
        </bean>
    </beans>
...
...
...

这里的message_en_US-*系列属性文件是配置站点的名称和黑名单的位置: 

resource.blacklist.dir=/var/resource/blacklist.txt
system.title.id=system.xmj_old.title

激活spring的profile 

profile是配置完了,但还要激活spring的profile特性。 
在web.xml做如下配置: 

<context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>xmj_old</param-value>
</context-param>

这样就激活spring配置文件中的profile为xmj_old的配置,但这样手动配置依然要改web.xml配置。 
Maven也带了profile的功能,而且我们的项目一般都是由Maven管理的,下面介绍Maven配置profile。 

Maven 配置profile 
Maven配置profile也很简单,举例如下: 

<profiles>
        <profile>
            <id>xmj_old</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <profiles.activation>xmj_old</profiles.activation>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>tomcat-maven-plugin</artifactId>
                        <version>1.1</version>
                        <configuration>
                            <!-- 配置项目自动发布服务器 -->
                            <url>http://xx.xx.xx.xx:8080/manager/text</url>
                            <path>/xmj-manager</path>
                            <server>Tomcat</server>
                            <warFile>target/${profiles.activation}.war</warFile>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>xmj_new</id>
            <properties>
                <profiles.activation>xmj_new</profiles.activation>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>tomcat-maven-plugin</artifactId>
                        <version>1.1</version>
                        <configuration>
                            <!-- 配置项目自动发布服务器 -->
                            <url>http://xx2.xx.xx.xx:8080/manager/text</url>
                            <path>/xmj-manager</path>
                            <server>Tomcat</server>
                            <warFile>target/${profiles.activation}.war</warFile>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
...
...
...
</profiles>

activeByDefault标签配置true表示默认激活的环境,直接install就是使用此配置的环境。 
这里有一个自定义属性配置:profiles.activation 它就是整合Maven profile 和spring profile 的重要配置 

整合Maven profile 和spring profile 

通过Maven管理web实现自动化,少改动就少出错,将上面web.xml配置改为下面的: 

<context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>${profiles.activation}</param-value>
</context-param>

这还不算完,还要配置Maven的一个插件: 

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <warName>${profiles.activation}</warName>
                    <!-- 激活spring profile -->
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/web.xml</include>
                            </includes>
                        </resource>
                    </webResources>
                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
                    <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                </configuration>
</plugin>

打包的时候Maven会去自动修改web.xml文件,根据占位符自动替换为对应的属性值 
warName标签可以不配置,我这里加上了所以需要加上前面的target/${profiles.activation}.war,否则会报找不到war包的异常。 

执行profile 
下面是见证奇迹的时刻 
在eclipse中执行命令: 

clean install

前面配置的默认环境是xmj_old这个,在执行完命令之后target文件夹下面出现了一个名为xmj_old.war的war包 

 

打开war包查看web.xml 

 

再测试下切换到其他的环境 
执行命令 

clean install -P xmj_new

-P 参数后面加上profile的id即可完成自动切换,执行完之后看下是否已经自动切换到id为xmj_new的profile环境下 
target文件下有了xmj_new.war的war包(xmj_old.war被clean掉了) 

 

打开war包查看web.xml文件 

 

如预期所料,Maven结合spring成功的完成了多环境的自动切换 
注:上面web.xml中的display-name和webAppRootKey都是使用占位符${profiles.activation}然后Maven自动替换的,如果你的项目中使用log4j/logback和spring,然后同一个项目部署多个实例到一个tomcat中,建议配置webAppRootKey这个参数 
请参考 log4j/logback + spring的webRootKey bug 

在本地eclipse内置tomcat中运行 

由于内置tomcat是直接编译源码然后放到指定的位置去加载 
所以上述的方法对于在内置tomcat运行是行不通的,在本地测试就非常蛋疼了 
网上说有设置项目属性中Maven的profile,查了下eclipse官网说是由于m2eclipse有bug的问题,这个配置已经给禁用了 
那就要另觅他法了,下面介绍一种探索出的一个方法: 

首先在main目录下新建一个profile文件夹,将WEB-INF下面的web.xml复制过来一份 
然后将WEB-INF下面的web.xml中的占位符修改成默认的配置(即没有占位符的,在本地测试用的profile值) 
profile文件夹下保留占位符的web.xml配置 

 

下面是WEB-INF下面没有占位符的正常的配置 

 

这些占位符我都换成了ysxj 
接下来修改Maven配置 
将配置: 

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <warName>${profiles.activation}</warName>
                    <!-- 激活spring profile -->
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/web.xml</include>
                            </includes>
                        </resource>
                    </webResources>
                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
                    <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                </configuration>
            </plugin>

修改为:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <warName>${profiles.activation}</warName>
                    <!-- 激活spring profile -->
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                                <!-- 这里是刚刚创建的目录 -->
                            <directory>src/main/profile</directory>
                                <!-- 目标目录为WEB-INF -->
                            <targetPath>WEB-INF</targetPath>
                            <includes>
                                <include>**/web.xml</include>
                            </includes>
                        </resource>
                    </webResources>
                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
                    <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                </configuration>
            </plugin>

最后见证奇迹 
执行命令 

install -P naruto

在target下面出现根据profile打的war包naruto.war 
接下来证明可以在eclipse的内置tomcat使用 
执行命令 

eclipse:eclipse  -Dwtpversion=1.5

编译成正常的eclipse工程,然后加入tomcat服务器,你会发现能运行成功。 
这里tomcat使用的是源码中WEB-INF下的web.xml,即刚才将占位符修改为ysxj的那个web.xml 
其原理就是在编译阶段将profile文件夹下的web.xml中的占位符替换成Maven中配置的属性,然后覆盖WEB-INF下面的web.xml 
这种方法麻烦的一点就是如果web.xml文件有修改 ,两个记得要同步,一般情况下这个文件也极少动 

ps. 骚年们不要手动了,来玩自动的吧 

Maven 整合 spring profile实现多环境自动切换的更多相关文章

  1. 使用maven整合spring+springmvc+mybatis

    使用maven整合spring+springmvc+mybatis 开发环境: 1. jdk1.8 2. eclipse4.7.0 (Oxygen) 3. mysql 5.7 在pom.xml文件中, ...

  2. springboot+maven整合spring security

    springboot+maven整合spring security已经做了两次了,然而还是不太熟悉,这里针对后台简单记录一下需要做哪些事情,具体的步骤怎么操作网上都有,不再赘述.1.pom.xml中添 ...

  3. Maven整合Spring与Solr

    首先,在maven的pom.xml文件中配置对spring和solrj客户端的依赖: <project xmlns="http://maven.apache.org/POM/4.0.0 ...

  4. Maven Filter与Profile隔离生产环境与开发环境

    Maven Filter与Profile隔离生产环境与开发环境 在不同的开发阶段,我们一般用到不同的环境,开发阶段使用开发环境的一套东西,测试环境使用测试环境的东西,可能有多个测试环境,生产环境使用的 ...

  5. (转载)maven profile多环境自动切换配置

    原文:https://www.cnblogs.com/adeng/p/7059588.html 痛点: 在java开发的过程中,我们经常要面对各种各样的环境,比如开发环境,测试环境,正式环境,而这些环 ...

  6. maven学习利用Profile构建不同环境的部署包

    项目开发好以后,通常要在多个环境部署,象我们公司多达5种环境:本机环境(local).(开发小组内自测的)开发环境(dev).(提供给测试团队的)测试环境(test).预发布环境(pre).正式生产环 ...

  7. spring Profile 为不同环境提供不同的配置支持

    说明 Profile为在不同环境下使用不同的配置提供了支持(开发环境下的配置和生产环境下的配置肯定是不同的, 例如, 数据库的配置) . 在spring开发中用@Profile 注解使用来选择行配置系 ...

  8. Maven + Spring 进行多环境自动切换功能

    在pom.xml的<project></project>的最下放写入如下代码: <!-- profiles setting start [mvn install -P x ...

  9. maven profile多环境自动切换配置,配置分离,排除文件

    痛点: 在java开发的过程中,我们经常要面对各种各样的环境,比如开发环境,测试环境,正式环境,而这些环境对项目的需求也不相同. 在此之前,我们往往需要手动去修改相对应的配置文件然后打成war,才能部 ...

随机推荐

  1. EM算法(2):GMM训练算法

    目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法运用 EM算法(4):EM算法证明 EM算法(2):GMM训练算法 1. 简介 GMM模型全称为Ga ...

  2. MySQL_监控用户下单地址没有就近仓库配送情况_20161215

    如果用户所在的地址位于A市场,A市场所就近的仓库应该为a,通过监控发现用户下单后配送仓库的不是a而是b仓库发货,这就会引起物流成本的增加. 因此对客户下单挑选最近的仓库进行监控是很有必要的 #C041 ...

  3. python模块学习心得

    初始模块 1.什么是模块 模块是用来实现某项功能的一大堆代码,为什么会有模块呢?过程式编程的时候为了减少程序员编程代码的重复性,就利用函数的调用减少了代码的重复性,但是某些时候程序会过于的庞大,我们会 ...

  4. 如何自己编写Makefile

    如何自己编写Makefile   相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用 ...

  5. zstuoj 4243 牛吃草 ——(二分+两圆交)

    这题上次补了以后忘记写博客了,现在补一下. 有两个注意点,第一是两圆相交的模板.可以通过任意一种情况手推出来. 第二是,实数二分要注意不用ans记录为妙,因为可能因为eps过小,导致ans无法进入记录 ...

  6. DATE 日期格式

    Oracle TO_DATE 日期格式 Oracle中TO_DATE格式2009-04-14 10:53TO_DATE格式(以时间:2007-11-02   13:45:25为例)           ...

  7. Android菜鸟成长记11 -- sqlite数据库的设计和升降级

    Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...

  8. CC1310电源管脚

    对于48pin脚的CC1310而言,属于电源类的管脚如下: 上述电源类管脚的关系如下: 1 VDDS类管脚 VDDS类管脚包括VDDS.VDDS2.VDDS3和VDDS_DCDC四个管脚.其中VDDS ...

  9. 预习笔记 多态 --S2 4.3

    第三章 多态 polymorphism 多态 instance 例子override 重载 constructor 构造器ClassCastException 类型转换异常upcasting 上抛 d ...

  10. SQL基本语句以及示例

    基本语句: /*dorp colunm*/ 语法:ALTER TABLE 表名   DROP COLUMN 要删除的字段 验证财务转换的正确性,查询以下两个表是否有数据 /*表连接inner jion ...