一劳永逸部署项目:通过tomcat加载环境变量
一劳永逸部署项目:通过tomcat加载环境变量
转载自:https://blog.csdn.net/u010414666/article/details/46499953
一、说明
项目中经常会用到xxx.properties作为一些参数的配置文件,而这些参数都是在启动tomcat时加载到环境变量中以便后面代码进行调用的。由于项目特殊性,需要将同一个war部署多份,分别连接各自的数据库,为了拷贝多个项目等繁琐的操作,减少部署的麻烦,探索了tomcat加载环境变量的加载方法,这样一来,在后续更新项目时,只需要替换一个war文件即可达到部署多个项目的效果。
这种方式也适用于其它部署项目的场景:
当项目中properties或其它配置文件中的环境变量参数较多时,每次部署项目都需要修改大量的配置参数,如:在不同环境下连接不同数据库、不同用户名密码、不同的上传路径等,每次部署项目时都需要将properties文件中的相关配置进行修改,不仅工作量大,而且容易出错,所以这种加载环境变量的部署方式可以大大简化操作并降低出错的可能性。
二、方法:
1、添加环境变量
在tomcat中新建ent-hlsn.xml,内容如下:
ent-hlsn.xml
<?xml version="1.0" encoding="UTF-8"?><Context path="/ent-hlsn" docBase="E:\WorkSpace\Carbon\Enm\webapp\target\com.skytech.enm.web-0.2.2-SNAPSHOT" >
<Environment name="enterpriseName" value="hlsn" type="java.lang.String" /></Context>
该文件是将E:\WorkSpace\ent路径下的应用部署到tomcat中,其中Environment 表示在启动tomcat后加载文件部署项目并将“enterpriseName”作为环境变量加入到tomcat中
(该文件为tomcat中部署项目时创建的context文件,即在tomcat_home/conf/Catalina/localhost路径下,详情参见tomcat部署应用的几种方式)
2、使用环境变量
修改applicationContext.xml中bean
applicationContext.xml
.....
<bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
......
</property></bean>
.....
其中 class必须使用 org.springframework.context.support.PropertySourcesPlaceholderConfigurer ,否则spring无法使用上述步骤中的环境变量,PropertySourcesPlaceholderConfigurer 为spring 3.1以后版本提供,在3.1之前版本中若想加载环境变量需将bean配置调整如下:
applicationContext.xml
......
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><!--设置systemPropertiesModeName为SYSTEM_PROPERTIES_MODE_OVERRIDE 打开允许覆盖--><property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/><property name="ignoreUnresolvablePlaceholders" value="true"/>
......
</bean>
......
3、测试:
TestProperties.java
@Service
public class TestService {
@Value("${enterpriseName}")
private String enterpriseName;
@Value("${enterprise.name}")
private String enterprise_name;
@PostConstruct
public void getProp() {
System.out.println("#################################");
System.out.println("enterpriseName : " + enterpriseName);
System.out.println("enterprise_name : " + enterprise_name);
System.out.println("#################################");
}
}
通过该方法即可取到ent-hlsn.xml中enterpriseName的值“hlsn”。
这里的注解@PostConstruct为spring容器初始化 bean时会调用的方法,如果项目中spring配置存在问题可能会没有被调用,如果是这样,那么控制台便无法打印出对应的输出信息,因此可以把输出信息放在项目必然会调用到的一些方法中进行测试,如果是web应用,也可以在一些方法中写上对应的输出语句并通过页面进行相应的操作来调用此处输出信息,以达到测试的效果。当然,如果spring配置没问题,可以直接像例子中这样进行测试,它可以在tomcat部署完应用后便打印出对应的环境变量信息。
三、其它测试:
在TOMCAT_HOME/conf/Catalina/localhost目录下再新建2个配置文件分别名为:ent-jbdc.xml、ent-sky.xml(这里的xml文件名即为项目部署的发布名,可根据自己项目的名称任意指定),配置文件内容如下:
ent-jbdc.xml
<?xml version="1.0" encoding="UTF-8"?><Context path="/ent-jbdc" docBase="E:\WorkSpace\Carbon\Enm\webapp\target\com.skytech.enm.web-0.2.2-SNAPSHOT" workDir="D:\app-work\jbdc"><Environment name="enterpriseName" value="jbdc" type="java.lang.String" /><Environment name="enterprise.name" value="jbdc--" type="java.lang.String" /></Context>
ent-sky.xml
<?xml version="1.0" encoding="UTF-8"?><Context path="/ent-sky" docBase="E:\WorkSpace\Carbon\Enm\webapp\target\com.skytech.enm.web-0.2.2-SNAPSHOT" workDir="D:\app-work\sky"><Environment name="enterpriseName" value="sky" type="java.lang.String" /><Environment name="enterprise.name" value="sky--" type="java.lang.String" /></Context>
启动tomcat
四、测试总结
1、多项目部署
当启动tomcat时。控制台能够正常打印出不同应用中enterpriseName 和 enterprise.name对应的环境变量值,说明多个应用之间不会存在冲突
2、环境变量命名规则
通过enterprise.name方式命名环境变量也能取值,说明环境变量命名规范中支持”.“符号命名环境变量
3、优先级
当web应用中properties文件内变量名和上述步骤xml文件中环境变量名相同时,tomca打印的是xml文件中配置的环境变量值,因此可以知道环境变量加载的优先级在xml中高于properties
一劳永逸部署项目:通过tomcat加载环境变量的更多相关文章
- linux中环境变量和系统加载环境变量的顺序
一.系统环境变量: /etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, uma ...
- 在eclipse中启动tomcat加载不了项目的解决方法
一.在server视图右键选择Add and Remove时,如果想要部署的项目不在左侧的待选列表中,或是弹出警告There are no resources that can be added or ...
- 修改类不用重启Tomcat加载整个项目
可以修改类不用重启Tomcat加载整个项目(手工启动) 配置reloadable=true(自动重载) 使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) Tomcat轻小,而We ...
- tomcat启动项目被重新加载,导致资源初始化两遍
之前没有遇到过这个问题,配了三天的项目了,惊人啊!!!各种怪问题全被我赶上了.真有种骂人的冲动. tomcat启动项目时,项目资源被加载两遍. 原因:配置虚拟目录导致,项目被重新加载. <Hos ...
- Eclipse自动部署项目到Tomcat的webapps下的有效方法
开发JavaEE项目,常用的工具有MyEclipse,Eclipse,netBeans等,我比较喜欢用Eclipse,因为相比MyEclipse体积小很多,响应速度也快,且足以满足需求,我喜欢简洁的编 ...
- TOMCAT加载两次war包(重复加载)
一.问题描述 项目中通过配置Context节点docBase,使docBase指向项目的绝对路径,可以直接通过IP加端口访问,今日发现意外bug,项目中某个功能奇数次执行成功,偶数次执行失败.二.问题 ...
- Tomcat加载JSP原理
Tomcat加载JSP主要有以下几个类: JspServlet JspServletWrapper JspCompilationContext JspRuntimeContext JsperLoade ...
- tomcat加载web.xml
这几天看tomcat的源码,疑问很多,比如之一“ tomcat 怎么加载 web.xml”,下面是跟踪的过程,其中事件监听器有一个观察者模式,比较好.记录下来以供参考 >>>> ...
- Linux部署java和tomcat的运行环境
Linux部署java和tomcat的运行环境 1.上传下载的jdk的rpm包和tomcat的tar包,我是放到/opt目录了,文件直接去官网下载即可. 2.如果之前安装过其他版本的jdk,最好先现在 ...
随机推荐
- springboot +element-axios跨域请求
1.初始化element项目 1.1:vue init webpage '项目名称' 1.2:npm i element-ui -S 1.3:在main.js添加 import ElementUI f ...
- HDU 4279 Number-------找规律题
Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- problem-solving-with-algorithms-and-data-structure-usingpython(使用python解决算法和数据结构) -- 基本数据结构 -- 队列
1. 什么是队列? 队列是项的有序结合,其中添加新项的一端称为队尾,移除项的一端称为队首. FIFO:先进先出 2. 队列抽象数据类型 队列操作如下: Queue() 创建一个空的新队列. 它不需要参 ...
- 用hmac验证客户端的合法性
服务器端程序 import os import hmac import socket def auth(conn): secret_key = b'rock' rand_b = os.urandom( ...
- html基础-标题标签-文字标签(2)
昨天说道了我的第一个网页,今天接着继续带大家深入,前期学习千万不要用代码工具哦!那样就少了深入了解的机会了哦! 一.大家都知道文章会有各种标题,网页其实也跟文章差不多也有专门来写标题的元素. (1). ...
- CSS3D动画制作一个3d旋转的筛子
希望这个demo能让大家理解CSS3的3d空间动画(其实是个假3D) 首先给一个3d的解剖图,x/y/z轴线轴线已经标出 下面附上添加特效的动画旋转 可以根据demo并参考上面解剖图进行理解 < ...
- JSP 插入到数据库的数据出现 “SQLServerException: 将截断字符串或二进制数据” 错误解决方案
最近在编写一个小型基于的jsp系统开发.掌握数据库一直感觉还不错.但是今天就出现了一个问题困扰我大半天.后来本来准备睡觉,但是觉得今天不解决这个问题恐怕晚上是“彻夜难眠啊”!!于是打开电脑,又开始捣腾 ...
- 网络I/O模型--01阻塞模式(普通)
很长一段时间内,大多数网络通信方式都是阻塞模式,即: · 客户端 向服务器端发出请求后,客户端会一直处于等待状态(不会再做其他事情),直到服务器端返回结果或者网络出现问题 . · 服务器端同样如此,当 ...
- Flutter Stack布局中定位的方式
前言 想要记录一下Stack布局中,定位的两种方式 代码 //……省略无关代码…… child: new Column( children: <Widget>[ new SizedBox( ...
- sql 单表查询练习
-- 工资高于3000的员工select * from emp where sal > 3000;-- 工资在2500和3000之间的员工select * from emp where sal ...