2011-12-22 25 views
6

Duplicar posibles:
How do I set environment variables from Java?¿Cómo establecer una variable de entorno en Java usando exec?

Estoy tratando de establecer una variable de entorno, y leer de nuevo para verificar que se estableció en realidad.

Tengo el siguiente:

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); 
    } 
} 

Sin embargo, parece que FOO siempre es nula, es decir, su probablemente no está correctamente instalada.

¿Tengo el comando exec correcto? Los javadocs afirman que puede tomar un argumento de cadena como el comando.

¿Alguna idea?

Respuesta

4

Esto no funcionará. Cuando comienza un nuevo proceso, ese proceso recibe una copia del entorno. Cualquier cambio que haga a las variables de entorno se realizará dentro de esa copia, y en ningún punto será visible para la persona que llama.

¿Qué estás tratando de lograr?

+0

¿Hay alguna forma de evitarlo? Quiero establecer la variable de entorno y luego usarla más tarde (en otro proceso iniciado por Ant) – Jimmy

+0

@ James.Elsey: En ese caso, tendrás que establecer la variable antes de lanzar hormiga, o desde dentro de la hormiga misma. No podrá cambiar la variable de un subproceso de hormiga y de alguna manera hacerla visible a otro subproceso de hormiga. – NPE

+0

@James, si está iniciando un proceso de Ant, entonces tiene la oportunidad de establecer variables de entorno en ese proceso en ese punto (cuando lo ejecuta desde Ant). – sudocode

10

Hay métodos exec sobrecargados en los que puede incluir una matriz de variables de entorno. Por ejemplo exec(String command, String[] envp).

He aquí un ejemplo (con prueba) de establecer una variable de entorno en un proceso hijo que 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); 
} 

Sin embargo, que establece la variable en la env del proceso creado, no de su actual (Java) proceso.

Del mismo modo, si está creando un proceso desde Ant (como menciona en los comentarios a aix) utilizando exec task, puede pasar variables de entorno al proceso secundario utilizando elementos anidados env, p. Ej.

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

Es nula debido a que inicie otra cmd.exe: es un ambiente diferente a la de la aplicación Java (respuesta Aix cf).

no creo que el tiempo de ejecución de Java puede cambiar una variable de entorno: puede leerlos, pero no puede cambiarlas.

Si desea cambiar una propiedad del sistema disponible en su ejecución de JVM, utilice System.setProperty (String key, valor de cadena ").

1

Mediante la ejecución de 'cmd.exe', se inicia un nuevo proceso, el cual recibe la nueva variable de entorno, sin embargo, el proceso java no establece esa nueva variable de entorno de esta manera.

En Unix/Windows, cada proceso tiene su propio conjunto de variables de entorno y hereda las variables de entorno de su matriz durante la creación del proceso .

System.getenv() sólo devuelve las variables de entorno que eran establecido cuando se inició el proceso, por lo que veo, no hay forma de cambiar las variables de entorno del proceso java en sí.

La única manera en que puede verificar si el conjunto funciona es comenzando un pequeño script por lotes donde establece y hace la verificación en un proceso.

Cuestiones relacionadas