IDEA常用插件 Mybatis源码分析(1) - Mybatis包目录简介 tair 1:tair学习 dataflow论文阅读笔记 Polysh的安装使用 SnappyData排序函数比较 Squirrel-sql客户端连接SnappyData手册 在虚拟机里显示Hello World spark学习博客推荐 SnappyData学习博客和官网文章 Docker常用命令 MyBatis支持的OGNL语法 mysql性能优化 mysql性能优化-优化Sql语句 java各版本新特性 mac上命令行操作 explain输出格式 从文件中读取zk配置——ZooKeeper编程技能(1) git进阶经验-从项目中删除移除的目录 Mongodb 学习之shell命令操作(3) mysql命令 git进阶经验-从多模块项目中分理子模块 从零学hadoop-搭建基础(单点)的Hdfs环境 ZooKeeper集群操作脚本 Vue安装使用 2 初学JVM之问答式记住类加载机制 2 初学JVM之问答式记住虚拟机性能监控与故障处理工具 2 初学JVM之问答式记住垃圾收集器 log4j2 按天生成日志文件 1 初学JVM之问答式记住java自动内存管理 MapReduce学习心得之MapReduce初识 log4j2 日志发送到kafka配置实战 log4j2 日志配置实战 Mongodb 学习之shell命令操作(二) Mongodb 学习之linux版本安装(一) Dubbo的初级使用 ServiceLoader内部实现分析 ServiceLoader 初级应用 log4j日志发送邮件配置实战 红黑树笔记 IDEA首次使用之前的配置 java源码学习之Enum java源码学习之String 自定义Spring tag标签 编写一键发布脚本 记一次Spring Scheduler莫名不执行的一次堆栈分析 kafka的基本操作 nginx 5:Nginx内部变量 nginx 4:Nginx日志管理 提高hadoop配置效率的shell脚本 Hive编程指南之一 Hive的安装 Ambari服务器安装 Ambari服务器管理集群 HBase分布式安装 windows下Eclipse远程调试运行MR程序 基于MapReduce新的API的编程Demo-wordCount window下Eclipse远程只读HDFS上的文件 YARN上节点标签 编写第一个MapReduce的wordcount程序 NodeManager的重启 搭建JStorm集群 YARN上的web应用代理 YARN上的ResourceManager的高可用方案 配置vmware中的虚拟机使用宿主机的共享网络 YARN架构简述 HDFS 架构 Spring的统一异常处理机制 Tomcat 配置服务 HDFS的viewfs指南 HDFS的Federation之路 HDFS基于QJM的HA之路 nginx 3:Nginx反向代理 mybatis操作主体流程 1.正则表达式学习-基础篇 log4j日志配置详解 mysql的时间函数 nginx 2:Nginx模块配置理论及实战 HashMap相关解析和测试文章 工作一年后的面试 用私有构造器或枚举类型强化Singleton属性 java中比较重要的图 mybatis处理枚举类 mybatis集成进spring Spring比较重要的几个截图 21.hadoop-2.7.2官网文档翻译-使用NFS的HDFS高可用性 20.hadoop-2.7.2官网文档翻译-使用仲裁日志管理器的HDFS高可用性 markdown在jekyll中支持的一些操作 Spring项目中配置sl4j和log4j的日志配置 19.hadoop-2.7.2官网文档翻译-HDFS命令指南 Spring的profile机制介绍 mybatis-generator反向生成 18.hadoop-2.7.2官网文档翻译-HDFS用户指南 17.hadoop-2.7.2官网文档翻译-实现Hadoop中Dapper-like追踪 16.hadoop-2.7.2官网文档翻译-Hadoop的KMS(key 管理服务器)-文档集 15.hadoop-2.7.2官网文档翻译-Hadoop的http web认证 14.hadoop-2.7.2官网文档翻译-服务级别的授权指南 13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop 09.hadoop-2.7.2官网文档翻译-Hadoop命令行微型集群 12.hadoop-2.7.2官网文档翻译-机架感知 11.hadoop-2.7.2官网文档翻译-代理用户-超级用户对其他用户的代表 10.hadoop-2.7.2官网文档翻译-原生库指南 08.hadoop-2.7.2官网文档翻译-文件系统规范 07.hadoop-2.7.2官网文档翻译-Hadoop接口类别 (转)浅析 Decorator 模式,兼谈 CDI Decorator 注解 06.hadoop-2.7.2官网文档翻译-Hadoop的兼容性 05.hadoop-2.7.2官网文档翻译-文件系统命令 04.hadoop-2.7.2官网文档翻译-Hadoop命令指南 03.hadoop-2.7.2官网文档翻译-集群安装 02.hadoop-2.7.2官网文档翻译-单节点集群安装 01.hadoop-2.7.2官网文档翻译-概述 Http 协议相应状态码大全及常用状态码 IDEA快捷键 JDBC Type与Java Type redis 12:redis 操作集合 mybatis-generator错误集合 redis 11:redis 错误集合 nginx 1:nginx的安装 redis 10:redis cluster命令操作 redis 9:redis实例集群安装 java设计模式 hadoop集群学习笔记(1) Apache Shiro 简介 vim编辑神器的进阶命令 Eclipse配置 Eclipse快捷键 Linux 测试题 Linux脚本学习(1) Linux启动简要过程 Centos7上安装Mysql hadoop集群学习笔记(1) (转)分布式发布订阅消息系统 Kafka 架构设计 maven 命令 Kafka集群安装 Kafka初步使用 redis 8:redis server 和 scripting命令操作 redis 7:redis transaction 和 connection命令操作 redis 6:redis hash 命令操作 redis 5:redis sorted_set 命令操作 搭建本地Jekyll+Markdown+Github的开发环境 Spring源码阅读笔记(2) redis 4:redis set命令操作 Spring添加任务调度配置 redis 3:Redis list命令操作 redis 2:redis 一般命令操作 redis 1:redis单机安装笔记 redis 0:redis配置属性描述 Spring源码阅读笔记(1) spark 错误集锦 spark集群安装 Linux 基本命令操作 Hadoop错误信息处理 Hadoop代码拾忆 从零开始搭建spring-springmvc-mybatis-mysql和dubbo项目 java知识点札记 java排错 Google Java Style 中文版 git进阶经验 github使用经验 MongoDB用户角色授权与AUTH启用 MongoDB 命令 MongoDB 特定规范 Spring MVC实现跳转的几种方式 史上最全最强SpringMVC详细示例实战教程 Spring 零星笔记 js中(function(){…})()立即执行函数写法理解 如何解决跨域问题 创建ajax简单过程 前端定位 设置MYSQL允许通过IP访问 mybatis异常 :元素内容必须由格式正确的字符数据或标记组成 如何为 WordPress 绑定多个域名的方法s WordPress工作原理之程序文件执行顺序(传说中的架构源码分析) Spring源码导入Eclipse中 基于PHPnow搭建Eclipse开发环境 解决wordpress首页文章内容截断处理的几种方法 ZooKeeper理论知识 ZooKeeper集群安装配置 Git常用命令速查表 Linux 4:磁盘与文件系统管理 Linux 3:文件与目录管理 Linux 2:文件权限与目录配置 Markdown输入LaTeX数学公式
从零学hadoop-搭建基础(单点)的Hdfs环境 MapReduce学习心得之MapReduce初识 Ambari服务器安装 Ambari服务器管理集群 windows下Eclipse远程调试运行MR程序 基于MapReduce新的API的编程Demo-wordCount window下Eclipse远程只读HDFS上的文件 YARN上节点标签 编写第一个MapReduce的wordcount程序 NodeManager的重启 YARN上的web应用代理 YARN上的ResourceManager的高可用方案 YARN架构简述 HDFS 架构 HDFS的viewfs指南 HDFS的Federation之路 HDFS基于QJM的HA之路 21.hadoop-2.7.2官网文档翻译-使用NFS的HDFS高可用性 20.hadoop-2.7.2官网文档翻译-使用仲裁日志管理器的HDFS高可用性 19.hadoop-2.7.2官网文档翻译-HDFS命令指南 18.hadoop-2.7.2官网文档翻译-HDFS用户指南 17.hadoop-2.7.2官网文档翻译-实现Hadoop中Dapper-like追踪 16.hadoop-2.7.2官网文档翻译-Hadoop的KMS(key 管理服务器)-文档集 15.hadoop-2.7.2官网文档翻译-Hadoop的http web认证 14.hadoop-2.7.2官网文档翻译-服务级别的授权指南 13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop 09.hadoop-2.7.2官网文档翻译-Hadoop命令行微型集群 12.hadoop-2.7.2官网文档翻译-机架感知 11.hadoop-2.7.2官网文档翻译-代理用户-超级用户对其他用户的代表 10.hadoop-2.7.2官网文档翻译-原生库指南 08.hadoop-2.7.2官网文档翻译-文件系统规范 07.hadoop-2.7.2官网文档翻译-Hadoop接口类别 06.hadoop-2.7.2官网文档翻译-Hadoop的兼容性 05.hadoop-2.7.2官网文档翻译-文件系统命令 04.hadoop-2.7.2官网文档翻译-Hadoop命令指南 03.hadoop-2.7.2官网文档翻译-集群安装 02.hadoop-2.7.2官网文档翻译-单节点集群安装 01.hadoop-2.7.2官网文档翻译-概述 hadoop集群学习笔记(1) hadoop集群学习笔记(1) Hadoop错误信息处理 Hadoop代码拾忆

Spring的profile机制介绍

2016年07月22日
摘要:Spring的profile机制介绍

目标

因spring在使用中,比如连接数据库,缓存等属性配置在不同的环境中有所不同,而且开发人员可能再本地开发环境,测试环境甚至是生产环境间切换。尤其是本地开发环境和测试环境切换频繁。 导致每次切换都需要更改配置文件,时间久了次数多了,不仅配置有可能会出错,而且开发人员也会因琐碎的无重复工作而苦不堪言。因此,本文将简单介绍spring的profile机制,可以对不同的环境做不同的配置。 然后只需要为不同的环境打包不同的配置即可。

前提

该文档是以项目开发为导向,基于maven项目讲解。因此在使用前需要的软件:Eclipse,tomcat 8,maven 3.3.3,mysql 5.6等。

在maven项目中配置profile

添加配置文件datasource-profile.xml

该配置文件中仅包含profile机制的配置。 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context.xsd
	">

	<!-- 开发环境 -->
	<beans profile="development">
		<context:property-placeholder
			ignore-unresolvable="true"
			location="classpath*:/env/default.properties, classpath*:/env/development.properties" />
	</beans>

	<!-- 测试环境 -->
	<beans profile="testing">
		<context:property-placeholder
			ignore-unresolvable="true"
			location="classpath*:/env/default.properties, classpath*:/env/testing.properties" />
	</beans>

	<!-- 生产环境 -->
	<beans profile="produce">
		<context:property-placeholder
			ignore-unresolvable="true"
			location="classpath*:/env/default.properties, classpath*:/env/produce.properties" />
	</beans>
</beans>

该方式是只加载每个环境不同的配置,比如上文提到的数据库,缓存等的配置信息。 展现下/env/default.properties配置文件中的内容:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://172.20.19.200:3306/esn_palmyy_plugin?useUnicode=true&characterEncoding=UTF-8
jdbc.username=esn_palmyy
jdbc.password=esn_palmyy

以上只是简单的数据库连接的配置。其他配置文件中的内容与其相同,但该机制中需要将不同配置文件中修改为不同的参数值。

各环境的配置文件

在spring的主配置文件applicationContext.xml中使用<import resource="classpath*:datasource-profile.xml" />引入该配置,这样spring的profile的配置就简单的完成了。 但是怎样在web项目启动时怎么指定使用的profile呢?请往下看。

在Eclipse中启动web项目时应用profile机制

要在web项目中使用profile机制,需要在web.xml文件中添加几行配置。

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

从属性名称上可以看出来该属性是指定web项目启动时激活使用的profile,value值即datasource-profile.xml中配置的profile属性值。 如果该参数不配置,那么不会加载任何profile下的内容,因此会导致使用到对应*.properties文件内占位符的其他配置会因为找不到替代值而报错。

虽然Eclipse中可以使用了,但如果使用mvn命令打包,每次更换环境都需要修改配置,好麻烦。能不能自动化一些呢?嗯可以,往下看。

mvn命令打包时应用profile机制

既然mvn打包要指定profile,那就需要改pom.xml文件了。

pom.xml中添加<profiles>内的所有内容:

<project>

<build>
		<plugins>
			<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                	<!-- 设置war包名称 -->
                    <warName>open-api</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>
		</plugins>
	</build>

	<profiles>
		<!-- 测试环境 -->
		<profile>
			<id>testing</id>
			<activation>
				<!-- 在不指定profile情况下,默认使用的profile -->
				<activeByDefault>true</activeByDefault>
			</activation>
			<properties>
				<profiles.activation>testing</profiles.activation>
			</properties>
			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.tomcat.maven</groupId>
					    <artifactId>tomcat-maven-plugin</artifactId>
					    <version>2.2</version>
						<configuration>
							<url></url>
							<path></path>
							<server></server>
							<warFile></warFile>
						</configuration>
					</plugin>
				</plugins>
			</build>
		</profile>
		
		<!-- 开发环境 -->
		<profile>
			<id>development</id>
			<properties>
				<profiles.activation>development</profiles.activation>
			</properties>
			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.tomcat.maven</groupId>
					    <artifactId>tomcat-maven-plugin</artifactId>
					    <version>2.2</version>
						<configuration>
							<url></url>
							<path></path>
							<server></server>
							<warFile></warFile>
						</configuration>
					</plugin>
				</plugins>
			</build>
		</profile>
		
		<!-- 生产环境 -->
		<profile>
			<id>produce</id>
			<properties>
				<profiles.activation>produce</profiles.activation>
			</properties>
			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.tomcat.maven</groupId>
					    <artifactId>tomcat-maven-plugin</artifactId>
					    <version>2.2</version>
						<configuration>
							<url></url>
							<path></path>
							<server></server>
							<warFile></warFile>
						</configuration>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>
</project>

<build>内的打包插件是激活spring的profile,没有该配置即使配置了<profiles>内的内容也不会生效。 而<profiles>内的每个<profile>对应上文配置的一个profile。

在项目根目录(pom.xml所在目录)下使用maven命令mvn clean package打包,当打包成功后,打开target/project-name-version/WEB-INF/web.xml文件,发现spring.profiles.active属性的值仍然是development。 怎么会没有改变呢?哦,原来是因为写的固定值,而不是占位符,没办法替换。

那将web.xml中的spring.profiles.active的值设置为占位符${profiles.activation}

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

再次执行maven命令mvn clean package,执行成功后查看web.xml会发现${profiles.activation}位置已经被testing(pom.xml中设置默认使用的profile)替换了。

那我要想指定其他的profile呢?使用命令mvn clean package -P profile-name,profile-name是你指定的存在的profile名称,比如produce。执行成功后再次查看${profiles.activation}已经被指定的produce替换了。说明启动应用就会使用profile为produce的配置了。

哎,怎么在Eclipse中不能启动web项目了,难道还要将web.xml中的配置改回去吗,这样改来改去太麻烦了?别急,往下看。

解决mvn打包和Eclipse启动web项目报错问题

既然mvn打包没问题了,那就专注的看Eclipse中启动项目的问题,而我们又不想每次都改web.xmlspring.profiles.active,怎么办呢?嗯… 有了

在Eclipse中配置变量值,不就可以将占位符${profiles.activation}替换掉了嘛,太聪明了。操作如下:

项目右击 –> Run As –> Run configurations –> 左侧:选择要启动该项目的tomcat; 右侧:点击Environment,点击New,新增name和value,name就是上文中说的占位符内的变量profiles.activation,value填写你想指定的profile名称,如development。 -> 点OK -> 然后点Run。 这样就可以在tomcat中成功启动项目了,并且不影响maven中的打包。

下次启动就不用配置了,直接部署项目启动tomcat就可以了。