2011-12-22 25 views
6

thể trùng lặp:
How do I set environment variables from Java?Làm thế nào để thiết lập một biến môi trường trong Java bằng cách sử dụng exec?

Tôi đang cố gắng để thiết lập một biến môi trường, và đọc nó trở lại để xác minh nó đã thực sự thiết lập.

Tôi đã có những điều sau đây:

import java.io.IOException; 

public class EnvironmentVariable 
{ 
    public static void main(String[] args) throws IOException 
    { 
     Runtime.getRuntime().exec("cmd.exe set FOO=false"); 

     String s = System.getenv("FOO"); 
     System.out.println(s); 
    } 
} 

Tuy nhiên, dường như FOO luôn luôn là null, có nghĩa là có thể nó không được thiết lập một cách chính xác.

Tôi có lệnh exec đúng không? Trạng thái javadocs nó có thể lấy đối số chuỗi làm lệnh.

Bất kỳ ý tưởng nào?

Trả lời

4

Điều này sẽ không hoạt động. Khi bạn bắt đầu một quy trình mới, quy trình đó sẽ nhận được một bản sao của môi trường. Bất kỳ thay đổi nào nó làm cho các biến môi trường được thực hiện bên trong bản sao đó, và tại thời điểm đó sẽ không hiển thị cho người gọi.

Bạn đang thực sự cố gắng đạt được điều gì?

+0

Có cách nào khác không? Tôi muốn thiết lập biến môi trường sau đó sử dụng nó sau này (trong một quá trình khác được khởi động bởi Ant) – Jimmy

+0

@ James.Elsey: Trong trường hợp đó, bạn sẽ phải thiết lập biến hoặc trước khi khởi chạy kiến, hoặc từ bên trong ant. Bạn sẽ không thể thay đổi biến từ một tiến trình con của kiến ​​và bằng cách nào đó biến nó thành một tiến trình con khác của ant. – NPE

+0

@ James, nếu bạn đang khởi động một quá trình từ Ant, thì bạn có cơ hội thiết lập các biến môi trường trong quá trình đó tại thời điểm đó (khi bạn thực thi nó từ Ant). – sudocode

10

Có các phương thức exec quá tải trong đó bạn có thể bao gồm một mảng các biến môi trường. Ví dụ: exec(String command, String[] envp).

Dưới đây là một ví dụ (với bằng chứng) của thiết lập một biến env trong một quá trình con bạn exec:

public static void main(String[] args) throws IOException { 

    String[] command = { "cmd", "/C", "echo FOO: %FOO%" }; 
    String[] envp = { "FOO=false" }; 

    Process p = Runtime.getRuntime().exec(command, envp); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String s = reader.readLine(); 
    System.err.println(s); 
} 

Tuy nhiên, đó đặt biến trong env của quá trình tạo ra, chứ không phải hiện tại (Java của bạn) quá trình.

Tương tự, nếu bạn đang tạo quy trình từ Ant (như bạn đề cập trong nhận xét cho aix) bằng cách sử dụng exec task, thì bạn có thể chuyển biến môi trường cho quá trình con bằng cách sử dụng các phần tử lồng nhau env, ví dụ:

<exec executable="whatever"> 
    <env key="FOO" value="false"/> 
</exec> 
0

Không có gì vì bạn khởi chạy một cmd.exe khác: đó là môi trường khác với ứng dụng Java của bạn (câu trả lời aix).

Tôi không nghĩ rằng thời gian chạy Java có thể thay đổi biến môi trường: nó có thể đọc chúng, nhưng không thể thay đổi chúng.

Nếu bạn muốn thay đổi thuộc tính hệ thống có sẵn trong thực hiện của bạn JVM, sử dụng System.setProperty (String key, String value ").

1

Bằng cách chạy "cmd.exe", bạn bắt đầu một quá trình mới, trong đó nhận được biến môi trường mới, tuy nhiên quá trình java không nhận được biến môi trường mới được đặt theo cách này.

System.getenv() chỉ trả về các biến môi trường thiết lập khi quá trình đã được bắt đầu, như xa như tôi thấy không có cách nào để thay đổi các biến môi trường của quá trình java chính nó.

Cách duy nhất bạn có thể kiểm tra xem tập hợp có hoạt động hay không bằng cách bắt đầu một tập lệnh lô nhỏ mà bạn đặt và thực hiện kiểm tra trong một quy trình.

Các vấn đề liên quan