如何在Java中添加环境变量?
可能重复:如何在Java中添加环境变量?,java,Java,可能重复: 我正在研究Java。我必须在java编程代码中添加一个环境变量,以便在使用process builder获取列表时可以使用该变量,如下所示: import java.util.Map; import java.util.Set; class helloworld { public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder("export MY_ENV
我正在研究Java。我必须在java编程代码中添加一个环境变量,以便在使用process builder获取列表时可以使用该变量,如下所示:
import java.util.Map;
import java.util.Set;
class helloworld {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("export MY_ENV_VAR=1");
Map<String, String> envMap = pb.environment();
Set<String> keys = envMap.keySet();
for(String key:keys){
System.out.println(key+" ==> "+envMap.get(key));
}
}
}
import java.util.Map;
导入java.util.Set;
类helloworld{
公共静态void main(字符串[]args){
ProcessBuilder pb=new ProcessBuilder(“导出我的环境变量=1”);
Map envMap=pb.environment();
Set keys=envMap.keySet();
用于(字符串键:键){
System.out.println(key+“==>”+envMap.get(key));
}
}
}
但通过上述试验,我无法正确获得环境变量。
那么如何设置环境变量呢
Map<String, String> env = pb.environment();
env.put("MV_ENV_VAR", "1");
export
将仅由shell解释
另见
一个完整的例子:
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("CMD", "/C", "SET");
Map<String, String> env = pb.environment();
env.put("MYVAR", "myValue");
Process p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
char[] buf = new char[1024];
while (!isr.ready()) {
;
}
while (isr.read(buf) != -1) {
System.out.println(buf);
}
}
这将证明所创建的流程使用的是受控环境。您可以使用process Builder对象获取环境变量:
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
ProcessBuilder pb=newprocessbuilder(“myCommand”、“myArg1”、“myArg2”);
Map env=pb.environment();
环境看跌期权(“VAR1”、“myValue”);
环境移除(“其他变量”);
环境put(“VAR2”,环境get(“VAR1”)+“后缀”);
您可以将所需的变量直接添加到ProcessBuilder.environment()
map中。
下面的代码应该有效:
import java.util.Map;
import java.util.Set;
class helloworld {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("/bin/sh"); // or any other program you want to run
Map<String, String> envMap = pb.environment();
envMap.put("MY_ENV_VAR", "1");
Set<String> keys = envMap.keySet();
for(String key:keys){
System.out.println(key+" ==> "+envMap.get(key));
}
}
import java.util.Map;
导入java.util.Set;
类helloworld{
公共静态void main(字符串[]args){
ProcessBuilder pb=new ProcessBuilder(“/bin/sh”);//或任何其他要运行的程序
Map envMap=pb.environment();
put(“我的环境变量”,“1”);
Set keys=envMap.keySet();
用于(字符串键:键){
System.out.println(key+“==>”+envMap.get(key));
}
}
}来自
减轻负担的一种可能的方法是找出一种方法
void setUpEnvironment(ProcessBuilder builder) {
Map<String, String> env = builder.environment();
// blah blah
}
void设置环境(ProcessBuilder){
Map env=builder.environment();
//废话
}
并在启动前将任何ProcessBuilders
传递给它
另外,您可能已经知道这一点,但可以使用相同的
ProcessBuilder
启动多个进程。因此,如果您的子流程相同,则无需反复进行此设置。您是否尝试过pb.environment().put(“key”、“value”)
?@berry120这是个玩笑,但我没有得到确切的答案。java.lang.UnsupportedOperationException位于java.util.Collections$UnmodifiableMap.put(Collections.java:1457)br.com.stilingue.services.remove_ocationTest.setUpTestEnv(removeCocationTest.java:29)
谢谢,但是env.put(“MV_env_VAR”,“1”);将仅在局部变量中设置env变量,但如果您再次获取processbuilder实例并获取map的内容,它将不会显示您提到的我们已设置的变量。@BSalunke更新了我的答案并添加了一个示例。@masksim_khokhlov如果我们再次获取processbuilder实例并获取map的内容会怎么样?它不会包含我们的variable@BSalunke为什么不会呢?会的!ProcessBuilder.environment()将始终返回相同的Map
实例。看看这本书。
import java.util.Map;
import java.util.Set;
class helloworld {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("/bin/sh"); // or any other program you want to run
Map<String, String> envMap = pb.environment();
envMap.put("MY_ENV_VAR", "1");
Set<String> keys = envMap.keySet();
for(String key:keys){
System.out.println(key+" ==> "+envMap.get(key));
}
}
void setUpEnvironment(ProcessBuilder builder) {
Map<String, String> env = builder.environment();
// blah blah
}