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. 骚年们不要手动了,来玩自动的吧
- 大小: 50.8 KB
- 大小: 60.4 KB
- 大小: 102.2 KB
- 大小: 165.1 KB
- 大小: 108.5 KB
- 大小: 166.5 KB
分享到:
相关推荐
三、创建Spring Dubbo Maven整合Demo 1. 新建Maven项目:使用IDE(如IntelliJ IDEA或Eclipse)创建一个新的Maven项目。 2. 分模块开发:根据业务逻辑,将项目划分为服务提供者(provider)和服务消费者(consumer)...
Spring还提供了一个强大的集成环境,可以方便地与其他框架和库进行整合,包括CXF。 将CXF与Spring整合的主要目的是利用Spring的管理能力来配置和控制CXF组件,例如服务端点、客户端代理等。这样可以实现更细粒度的...
整合Spring和Hibernate,可以利用Spring的声明式事务管理来处理Hibernate的事务,同时利用Spring的AOP能力实现事务、日志等切面功能。 1. **配置整合** - 在Spring的配置文件中,我们需要导入Hibernate的相关库,...
- 利用 Spring Boot 的 Profile 功能,根据不同环境配置不同的数据源,方便测试和生产环境的切换。 - 使用统一的异常处理,如全局的 HttpExceptionAdvice,统一处理数据库操作中的异常,提高用户体验。 通过上述...
2. **Profile切换**:通过`spring.profiles.active`属性,可以在不同环境下切换配置。 3. **外部化配置**:允许将配置存储在单独的文件或环境变量中,提高灵活性。 **五、Spring Boot 集成Spring MVC** 1. **配置...
- 配置Maven的profile,进行不同环境的配置切换。 - 使用Spring的缓存管理,如EhCache或Redis,提高数据访问效率。 - 进行性能测试,使用JMeter等工具评估系统性能并进行调优。 通过这个教程,开发者能够从零...
- 利用Spring的Profile特性,根据环境(开发、测试、生产)切换不同的配置。 通过以上知识点,开发者可以有效地使用Spring和CXF进行Web服务的开发和集成,实现高效、可测试和可扩展的服务架构。注意,随着技术的...
7. **整合Spring与Hibernate**:通过SessionFactoryBean配置Hibernate,使用Spring的TransactionManager进行事务管理。 8. **测试**:编写单元测试和集成测试,验证各个组件是否正常工作,如Action是否正确跳转,...
- **使用`@SpringBootApplication`注解**:介绍这个注解的作用及其如何整合多个Spring Boot特性。 - **运行应用程序**: - **从IDE中运行**:展示如何使用集成开发环境(IDE)运行Spring Boot应用。 - **作为一个...
Spring Boot 支持热部署,可以通过使用 `spring-boot-devtools` 依赖来实现自动重启服务器,从而实现在代码修改后无需手动重启服务器即可看到效果。 **6.2 您使用了哪些 Starter Maven 依赖项?** Spring Boot ...
通过以上步骤,我们可以成功搭建并使用 Spring Cloud Config 作为配置中心,实现了对多个微服务项目的配置集中管理和维护。此外,通过 Git 仓库中的多文件夹结构存放配置文件,使得配置文件的组织更加清晰和有序,...
3. 利用Spring的`@Profile`注解,根据环境选择不同的配置。 通过以上步骤,我们可以实现Spring 4.x与MyBatis 4的深度整合,享受到两者的强大功能。在实际开发中,应结合具体需求灵活运用,不断优化整合方案,提高...
5. **配置CXF与Spring的整合**:使用CXF提供的Spring命名空间,配置CXF与Spring的整合,如启用CXF的自动扫描功能等。 6. **启动应用并测试**:启动应用,并通过工具(如SoapUI)测试WebService是否正常工作。 #### ...
总的来说,通过Spring Boot、MyBatis、Druid和PageHelper的整合,我们可以轻松地实现多数据源环境下的高效分页查询。这种方式不仅提高了系统的灵活性,也优化了数据库操作的性能,降低了开发难度。同时,Druid提供的...
- 在 Git 仓库中为每个应用创建对应的配置文件,例如 `application-{profile}.yml`,其中 `{profile}` 可以是 `dev`、`test` 或 `prod` 等不同的环境标签。 ##### 1.2 Spring Cloud Config Client Spring Cloud ...
- **实现方法**: 使用`@Profile`注解结合配置文件的方式实现多环境配置切换。 **3.2 配置文件示例** - **开发环境**: - 文件名: `application-dev.yml` - 内容示例: ```yaml server: port: 8081 ``` - **...
5. **Profile配置**:定义不同环境(如开发、测试、生产)的配置文件,方便切换。 6. **聚合与继承**:聚合多个模块进行统一构建,继承则用于共享公共配置。 **分模块开发** 在大型项目中,分模块开发是常见的组织...
- **整个Spring技术栈的大整合**:SpringBoot不仅包含了Spring Framework的核心功能,还集成了Spring Cloud等其他Spring项目,为开发者提供了一套完整的解决方案。 - **J2EE开发的一站式解决方案**:SpringBoot支持...
- 结合Spring的Profile特性,根据环境动态切换不同的服务配置。 综上所述,"dubbo-parent001.zip"是一个关于如何将Dubbo与Spring集成的实践案例,它为开发者提供了一个学习和参考的平台,帮助理解并掌握这两种技术...
总结来说,"ci-spring"项目是一个关于如何在Java Spring环境中实现高效持续集成的示例,涵盖了从项目结构到CI流程配置的多个方面。通过研究这个项目,开发者可以提升在Spring框架下的CI实践技能,使得开发流程更加...