【问题标题】:How to set environment variable in java [duplicate]如何在java中设置环境变量[重复]
【发布时间】:2015-02-23 13:42:11
【问题描述】:

我想在 JAVA 中设置环境变量。为此,我在互联网上搜索了很多并得到了以下代码。

void set_up_environment_var() throws IOException
{
     ProcessBuilder pb = new ProcessBuilder("CMD.exe", "/C", "SET"); // SET prints out the environment variables  
     pb.redirectErrorStream(true);  

     Map<String,String> env = pb.environment();  

     String str1 = ";C:\\naved\\bin";
     String path = env.get("Path") ;//+ ";C:\\naved\\bin";  
     System.out.println("ok , I am coming . "+path.toLowerCase().contains(str1.toLowerCase()));
     env.put("Path", path.concat(str1));  
     Process process = pb.start();  
     BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));  
     String line;  
     while ((line = in.readLine()) != null)  
     {  
    //     System.out.println(line);  
     }  
}

但执行后,“PATH”变量中没有设置环境变量。为什么?

【问题讨论】:

  • 你从中得到了什么?
  • 操作系统中的环境不是全局空间,它是执行进程的本地空间。当一个进程启动另一个进程时,新进程的环境从父进程继承。你永远不能从子进程中改变父进程的环境。
  • 要做到这一点,您将通过 JNI/JNA 在本机级别弄脏自己的双手
  • 您的要求并不完全清楚。例如,“环境变量未在“PATH”变量中设置。 PATH 变量是一个环境变量,所以你的问题听起来有点困惑。你到底想达到什么目标?

标签: java environment-variables


【解决方案1】:

一个进程只能设置它自己的环境变量,以及它将在未来产生的进程。进程不能设置已经运行的进程的环境变量。

您可能已经注意到,当您在系统中全局手动设置环境变量时。它们不会影响已经运行的进程实例,例如已经运行的cmd.exe 或已经运行的bash。您可能还注意到,如果您以这种方式设置环境变量,那么新进程是否获得新的环境变量设置取决于新进程的启动方式。默认行为是使用其父进程的环境副本启动进程,即启动新进程的进程。

作为一个简单的解释,你可以说有根进程和子进程。根进程从全局设置中获取环境设置,子进程从其父进程继承环境设置。

问题是你想通过设置环境来实现什么?我可以想到至少三个你可能想要实现的不同目标:

  • 全局设置环境,作为安装程序的一部分。
  • 为当前运行的 JVM 设置环境。
  • 为您将要启动的进程设置环境。
  • 直接为调用进程设置环境(不可能!)。
  • 间接设置调用进程的环境。

全局设置环境,作为安装程序的一部分

这是高度系统特定的。 在 UNIX 上,这个话题实际上是被避免的。 程序宁愿提供设置环境的包装脚本,而不是设置全局环境变量。 UNIX 中的理念是,通常环境变量仅在变量对不止一个进程有用的情况下使用。 此类变量的示例是 PATH 和 EDITOR。

在 Windows 上,您可能会调用 regedit 来修改环境。

设置当前运行的JVM的环境

没有用于设置当前运行的 JVM 环境的 API,因此您必须使用 JNI。但是,请注意,没有 API 是有充分理由的,其中部分原因可能是 JVM 不希望其环境被某些 Java 代码任意更改。

为将要启动的进程设置环境

当您使用Runtime.exec() 方法之一启动进程时,您实际上可以提供您喜欢的环境。

如果您想使用修改后的环境启动进程,最好的方法是使用ProcessBuilder。它提供了一个方法environment()为新进程修改环境。

直接为调用进程设置环境

如果你想用Java实现set命令,算了,这是不可能的。 set 不是程序,它是 shell 的内部命令,即 cmd.exe。由于上面的解释,否则它不会起作用。

间接设置调用进程的环境

您可以间接为调用进程设置环境 - 如果调用进程配合。如果您的调用进程是cmd.exe 或sh,您可以让您的Java 程序生成一个临时批处理文件或shell 脚本,然后让调用cmd.exe 或sh 执行该批处理文件或shell 脚本。

【讨论】:

    【解决方案2】:

    如何在命令行中使用 setx.exe 设置路径的简单示例:

    setx path "jdk bin path"
    

    前

    setx path "C:\Program Files (x86)\Java\jdk1.7.0_04\bin"
    

    在你的代码上试试这个

    喜欢

        try {
    
            // using the Runtime exec method:
            Process p = Runtime.getRuntime().exec("setx path C:\Program Files (x86)\Java\jdk1.7.0_04\bin");
    
            BufferedReader stdInput = new BufferedReader(new
                 InputStreamReader(p.getInputStream()));
    
            BufferedReader stdError = new BufferedReader(new
                 InputStreamReader(p.getErrorStream()));
    
            // read the output from the command
            System.out.println("Here is the standard output of the command:\n");
            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
            }
    
            // read any errors from the attempted command
            System.out.println("Here is the standard error of the command (if any):\n");
            while ((s = stdError.readLine()) != null) {
                System.out.println(s);
            }
    
            System.exit(0);
        }
        catch (IOException e) {
            System.out.println("exception happened - here's what I know: ");
            e.printStackTrace();
            System.exit(-1);
        }
    

    【讨论】:

    猜你喜欢
    • 2021-09-16
    • 2018-09-25
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多