一、场景
在部署java应用时有时需要通过System.setProperty的方式设置环境变量用来存储一下常用的参数。但是在实际使用中发现当多个java应用同时以此方式设置系统变量,变量名相同,且都部署在同一个server里时,这几个java应用在引用该变量时会相互干扰。
二、验证
新建两个javaweb项目,并且都在web.xml中配置自启动servlet。用以当服务启动时,对应的servlet会在初始化的时候获取并修改系统变量参数,从而判断是否会相互干扰。
servlet代码如下:
public class Test extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
public Test() {
System.out.println("1-初始化开始");
String abc = System.getProperty("abc");
System.out.println("1-当前abc环境变量:"+abc);
System.out.println("1-修改abc变量");
System.setProperty("abc", "3333");
System.out.println("1-初始化完毕");
abc = System.getProperty("abc");
System.out.println("1-当前abc环境变量:"+abc);
}
}
public class Test extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
public Test() {
System.out.println("2-初始化开始");
String abc = System.getProperty("abc");
System.out.println("2-当前abc环境变量:"+abc);
System.out.println("2-修改abc变量");
System.setProperty("abc", "3333");
System.out.println("2-初始化完毕");
abc = System.getProperty("abc");
System.out.println("2-当前abc环境变量:"+abc);
}
}
将两个javaweb应用同时部署到同一个tomcat中启动,如果两个应用彼此的系统变量相互没有干扰,则应该在控制台输出:
2-初始化开始
2-当前abc环境变量:null
2-修改abc变量
2-初始化完毕
2-当前abc环境变量:3333
1-初始化开始
1-当前abc环境变量:null
1-修改abc变量
1-初始化完毕
1-当前abc环境变量:3333
然而实际情况为:
2-初始化开始
2-当前abc环境变量:null
2-修改abc变量
2-初始化完毕
2-当前abc环境变量:3333
1-初始化开始
1-当前abc环境变量:3333
1-修改abc变量
1-初始化完毕
1-当前abc环境变量:3333
可见当在同一个server里部署多个应用且同时需要修改系统变量时,是会存在相互干扰的情况的。经测试多个java应用部署到WebSphere的同一个server里时同样会出现这种情况。
三、结论
对于同一个server里部署多个应用且同时需要修改系统变量时,如果待修改的系统变量名相同,则会出现相互干扰的情况。
四、建议
在java应用中尽可能不用系统变量来存储参数,如果必须使用,则需要注意对于同一个server,多个应用设置的系统变量名不能相同,否则可能会出现相互干扰的情况。