一劳永逸部署项目:通过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加载环境变量的更多相关文章

  1. linux中环境变量和系统加载环境变量的顺序

    一.系统环境变量: /etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, uma ...

  2. 在eclipse中启动tomcat加载不了项目的解决方法

    一.在server视图右键选择Add and Remove时,如果想要部署的项目不在左侧的待选列表中,或是弹出警告There are no resources that can be added or ...

  3. 修改类不用重启Tomcat加载整个项目

    可以修改类不用重启Tomcat加载整个项目(手工启动) 配置reloadable=true(自动重载) 使用Debug模式,前提是仅限于局部修改.(修改类不用重启--热加载) Tomcat轻小,而We ...

  4. tomcat启动项目被重新加载,导致资源初始化两遍

    之前没有遇到过这个问题,配了三天的项目了,惊人啊!!!各种怪问题全被我赶上了.真有种骂人的冲动. tomcat启动项目时,项目资源被加载两遍. 原因:配置虚拟目录导致,项目被重新加载. <Hos ...

  5. Eclipse自动部署项目到Tomcat的webapps下的有效方法

    开发JavaEE项目,常用的工具有MyEclipse,Eclipse,netBeans等,我比较喜欢用Eclipse,因为相比MyEclipse体积小很多,响应速度也快,且足以满足需求,我喜欢简洁的编 ...

  6. TOMCAT加载两次war包(重复加载)

    一.问题描述 项目中通过配置Context节点docBase,使docBase指向项目的绝对路径,可以直接通过IP加端口访问,今日发现意外bug,项目中某个功能奇数次执行成功,偶数次执行失败.二.问题 ...

  7. Tomcat加载JSP原理

    Tomcat加载JSP主要有以下几个类: JspServlet JspServletWrapper JspCompilationContext JspRuntimeContext JsperLoade ...

  8. tomcat加载web.xml

    这几天看tomcat的源码,疑问很多,比如之一“ tomcat 怎么加载 web.xml”,下面是跟踪的过程,其中事件监听器有一个观察者模式,比较好.记录下来以供参考 >>>> ...

  9. Linux部署java和tomcat的运行环境

    Linux部署java和tomcat的运行环境 1.上传下载的jdk的rpm包和tomcat的tar包,我是放到/opt目录了,文件直接去官网下载即可. 2.如果之前安装过其他版本的jdk,最好先现在 ...

随机推荐

  1. LinqProvider系列(三)如何实现自己的Linq Provider?

    这篇文章将在前人的肩上,继续完成实现Linq Provider的任务. 首先,我们列出linq语法的解析过程: linq本质上就是把我们惯用的语法糖,变成了一颗表达式树,然后由不同的linq Prov ...

  2. 如鹏网学习笔记(四).Net常用类库

    .Net常用类库 一.String成员方法(常用) 1,bool Contains(string str) 判断字符串对象是否包含给定的内容 2,bool StartsWith(String str) ...

  3. Android Studio开发笔记

    工欲善其事,必先利其器. 来分享下一些tips吧. android studio优化 我的习惯是从visual studio沿袭过来的,所以快捷键都是参照VS改过来的. 设置调优 不打开上次打开的工程 ...

  4. VisualVM监控远程阿里云主机

    一.前言 使用VisualVM监控远程主机,主要是要在远程主机上部署JMX服务和jstat服务,jstat服务的部署花了我半天的时间,而且,网上的资基本都是缺胳膊少腿的,没有一篇是一个整体(行得通的) ...

  5. 撩课-Web大前端每天5道面试题-Day24

    1.下面的代码将输出什么? ; i < ; i++) { setTimeout(function() { console.log(i); }, i * ); } 闭包在这里能起什么作用? 上面的 ...

  6. web开发基础--字节序

    字节是网络传输上的最小单位,是web开发中需要了解的一个知识点. 1.有效位 在谈字节序前需要先了解有效位,有效位分为两种:最低有效位(LSB: Least Significant Bit) 和最高有 ...

  7. Hibernate的多对多实例

    在完成了一对多的实例的基础上,继续做多对多实例.例子是老师和学生,一个老师教多个学生,一个学生也有多个老师. 文档结构如图:

  8. Effective C++ 避免数组多态

    #include <iostream> #include <cstdlib> using namespace std; class Base { public: int idx ...

  9. :after伪类+content内容生成经典应用举例——张鑫旭

    一.简单说说content内容生成 content内容生成就是通过content属性生成内容,content属性早在CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容. ...

  10. Android获取SD卡路径及SDCard内存的方法

    这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...