2011-09-08 12 views
46

¿Existe alguna manera más fácil de especificar múltiples Propiedades del sistema en la línea de comandos para un programa Java en lugar de tener múltiples instrucciones -D?Establecer múltiples propiedades del sistema Línea de comandos de Java

Tratando de evitar esto:

java -jar -DNAME="myName" -DVERSION="1.0" -DLOCATION="home" program.jar 

pensé que había visto un ejemplo de alguien que use uno -D y algunos cadena entre comillas después de eso, pero no puedo encontrar el ejemplo de nuevo.

Respuesta

37

La respuesta es NO. Es posible que haya visto un ejemplo donde alguien habría puesto algo como:

-DArguments=a=1,b=2,c=3,d=4,e=cow

A continuación, la aplicación sería analizar el valor de Arguments cadena de propiedad para obtener los valores individuales. En su main puede obtener los valores clave como (se garantiza formato de entrada Suponiendo):

String line = System.getProperty("Arguments"); 
if(line != null) { 
    String str[] = line.split(","); 
    for(int i=1;i<str.length;i++){ 
     String arr[] = str[i].split("="); 
     System.out.println("Key = " + arr[0]); 
     System.out.println("Value = " + arr[1]); 
    } 
} 

Además, el -D debe ser antes de la clase principal o el archivo jar en la línea de comandos de Java. Ejemplo: java -DArguments=a=1,b=2,c=3,d=4,e=cow MainClass

10

No hay nada en el Documentation que mencione nada de eso.

he aquí un fragmento:

-Dproperty = valor Establecer un valor de propiedad del sistema. Si el valor es una cadena que contiene espacios, debe encerrar la cadena entre comillas dobles:

java -Dfoo = "alguna cadena" SomeClass

+0

Qué clase hace 'SomeClass' se refiere? Estoy tratando de configurar esta propiedad para leer un archivo '.properties', usando Spring, Struts y Tomcat 8.5, esa es la única parte del comando que todavía no está claro para mí – Frakcool

+0

@Frakcool' SomeClass' sería la clase con el principal método que está tratando de ejecutar. Típicamente tendría una declaración de paquete y debería usar el nombre de clase completo para ejecutarlo. – adarshr

+0

Oh, lo entiendo, era lo que estaba pensando, sin embargo, en una aplicación web no hay un método "principal", así que creo que está hecho en las propiedades de Tomcat, ¿verdad? – Frakcool

13

En lugar de pasar las propiedades como argumento, es posible utilizar a. propiedades para almacenarlos.

+5

+1: También puede cargarlas en las propiedades del sistema con' System.getProperties(). Load (new FileInputStream ("my.properties")) 'Sin embargo, tener sus propias propiedades es probable que sea un mejor enfoque. –

0

Si las propiedades requeridas deben establecer en el sistema, entonces no hay más remedio que -D Pero si necesita esas propiedades mientras bootstrapping una aplicación, la carga de propiedades a través de los archivos proerties es una mejor opción. No requerirá cambiar la construcción de una sola propiedad.

0

Puede usar la variable de entorno JAVA_TOOL_OPTIONS para establecer las opciones. Me funcionó con Rasbian. Ver Environment Variables and System Properties que tiene esto que decir:

En muchos entornos, la línea de comandos no es fácilmente accesible a iniciar la aplicación con las opciones de línea de comandos necesarios.

Esto sucede a menudo con las aplicaciones que utilizan las máquinas virtuales incrustados (es decir, que utilizan la API de invocación Java Native Interface (JNI) para iniciar el VM), o cuando el arranque está profundamente anidado en los scripts. En estos entornos , la variable de entorno JAVA_TOOL_OPTIONS puede ser útil para aumentar una línea de comando.

Cuando se establece esta variable de entorno, la función JNI_CreateJavaVM (en el API de invocación JNI), la función JNI_CreateJavaVM añade el valor de la variable de entorno a las opciones suministradas en su argumento JavaVMInitArgs.

Sin embargo, este uso de la variable de entorno puede estar deshabilitado por razones de seguridad.

En algunos casos, esta opción está deshabilitada por razones de seguridad. Para el ejemplo , en el sistema operativo Oracle Solaris, esta opción es deshabilitada cuando la identificación efectiva del usuario o grupo difiere de la ID real.

Vea este ejemplo que muestra la diferencia entre especificar en la línea de comando versus usar la variable de entorno JAVA_TOOL_OPTIONS.

screenshot showing use of JAVA_TOOL_OPTIONS environment variable

Cuestiones relacionadas