关于java通过System.setProperty设置环境变量作⽤范围验证
⼀、场景
在部署java应⽤时有时需要通过System.setProperty的⽅式设置环境变量⽤来存储⼀下常⽤的参数。但是在实际使⽤中发现当多个java应⽤同时以此⽅式设置系统变量,变量名相同,且都部署在同⼀个server⾥时,这⼏个java应⽤在引⽤该变量时会相互⼲扰。
⼆、验证
新建两个javaweb项⽬,并且都在l中配置⾃启动servlet。⽤以当服务启动时,对应的servlet会在初始化的时候获取并修改系统变量参数,从⽽判断是否会相互⼲扰。
servlet代码如下:
public class Test extends HttpServlet{
/**
*
*/
private static final long serialVersionUID =1L;
public Test(){
System.out.println("1-初始化开始");
String abc = Property("abc");
System.out.println("1-当前abc环境变量:"+abc);
System.out.println("1-修改abc变量");
System.setProperty("abc","3333");
System.out.println("1-初始化完毕");
abc = Property("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 = Property("abc");
System.out.println("2-当前abc环境变量:"+abc);
System.out.println("2-修改abc变量");
System.setProperty("abc","3333");
System.out.println("2-初始化完毕");
abc = Property("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
java系统变量设置可见当在同⼀个server⾥部署多个应⽤且同时需要修改系统变量时,是会存在相互⼲扰的情况的。经测试多个java应⽤部署到WebSphere 的同⼀个server⾥时同样会出现这种情况。
三、结论
对于同⼀个server⾥部署多个应⽤且同时需要修改系统变量时,如果待修改的系统变量名相同,则会出现相互⼲扰的情况。
四、建议
在java应⽤中尽可能不⽤系统变量来存储参数,如果必须使⽤,则需要注意对于同⼀个server,多个应⽤设置的系统变量名不能相同,否则可能会出现相互⼲扰的情况。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。