一劳永逸部署项目:通过tomcat加载环境变量

时间:2021-06-14 21:21:38

一劳永逸部署项目:通过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