一劳永逸部署项目:通过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. 项目托管到Github上

    一.注册github账号   首先需要注册一个github账号,注册地址:https://github.com 接着会来到这 然后会收到一封github发的邮件,进入邮箱验证 二.创建个人的githu ...

  2. python学习之老男孩python全栈第九期_数据库day003知识点总结 —— MySQL数据库day3

    复习: 1. 增 insert into xx(name) values('root'),('xxx'); insert into xx(name) select id from tb1; 2. 自增 ...

  3. SQL SERVER DATETIME应用

    ),, , ),); ),, ),); ),, , ),); ),, ),); ),, , ),); ),, ),); How to get first and last day of previou ...

  4. Hackerrank GCD Product(莫比乌斯反演)

    题意 题目链接 Sol 一道咕咕咕了好长时间的题 题解可以看这里 #include<bits/stdc++.h> #define LL long long using namespace ...

  5. 微信支付报错:time_expire时间过短,刷卡至少1分钟,其他5分钟]

    查了下代码: $input->SetTime_expire(date("YmdHis", time() + 600));//二维码过期时间.默认10min 10分钟,没问题. ...

  6. 使用手机预览移动端项目(Vue)

    1.在 npm run dev 启动Vue项目之后.例:http://localhost:8095/#/chatList 2.查看本机的 IP (WIN + R + cmd ) 输入 ipconfig ...

  7. p2p登录拦截

    1.编写拦截标签 package com.xmg.p2p.base.util; import java.lang.annotation.ElementType; import java.lang.an ...

  8. Hadoop总结

    背景 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. Mapreduce1 vs YA ...

  9. Oracle数据库通过DBLINK实现远程访问

    什么是DBLINK? dblink(Database Link)数据库链接顾名思义就是数据库的链接  ,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就 ...

  10. 回归JavaScript基础(四)

    主题:JavaScript变量.作用域和内存问题 JavaScript的变量和别的语言比起来是与众不同的.说道变量,不得不谈他的作用域.同很多语言一样,JavaScript开发者也不用担心开发中内存的 ...