How to activate maven profile inside eclipse
Normally maven is use for project dependency management and lifecycle, so there are several developers working on it. Each has its own development environment either in windows, linux or mac. To do this we create several profiles for each developer in pom.xml.
<profiles> <profile> <id>windows</id> <properties> <jboss.home>C:/manaty/jboss-4.2.3.GA</jboss.home> </properties> </profile> <profile> <id>linux</id> <properties> <jboss.home>/home/project/jboss-4.2.3.GA</jboss.home> </properties> </profile> </profiles>
And then invoke mvn with the -P argument. Example:
mvn install -Pwindows mvn install -Plinux
How could we do the same inside eclipse. There are 2 ways: 1.) Right click on the project->click properties->select maven menu
If in case maven is not present, right click on project->Maven->Enable Maven Dependency 2.) Right click on project->Run As->Run Configurations->Maven Build->Add a new build (set profile and goal)
Maven 整合 spring profile实现多环境自动切换
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. 骚年们不要手动了,来玩自动的吧