2011-01-22 14 views
8

Sé que puedo obtener los argumentos de la línea de comandos en el método "principal", pero necesito poder obtenerlos indirectamente.¿Tiene Java un equivalente a Environment.GetCommandLineArgs() de C#?

Gracias por su ayuda.

+2

es posible que desee volver a pensar su diseño si tiene que hacer algo como esto – Mike

+2

Creo que la respuesta es que no puedes. –

+0

@Mike La clase que necesita los argumentos necesita tener acceso a los verdaderos argumentos de la línea de comandos, incluso si los objetos que la ejemplifican no tienen acceso a ellos. Como mi clase forma parte de una biblioteca, no hay forma de garantizar que las clases que usan la biblioteca tengan acceso a los argumentos de la línea de comandos, aunque necesitarán usar mi clase. Además, este problema no es lo suficientemente significativo para el diseño general para obligar a otras clases a cambiar su diseño. – Mackenzie

Respuesta

2

Puede enumerar los hilos, encontrar el hilo principal y rastrear por el trazado de la pila hasta encontrar la llamada a main y extraer los argumentos.

actualización un comentario indica que esto no funcionará por sí solo, y creo que el comentario es correcto. Olvidé las capacidades de introspección de la pila o mentalmente mezclado en JVMTI.

Así que, aquí está el plan B. Conéctese con usted mismo con JMX. El VM Summary MBean tiene los argumentos.

Connection name:  
pid: 77090 com.basistech.jdd.JDDLauncher -config src/main/config/benson-laptop-config.xml 

Todo esto Habiendo dicho esto, lo que debe hacer es llamar a System.getProperty y vivir con la necesidad de utilizar -D para pasar parámetros del mundo exterior hacia abajo en su cueva.

+2

¿Cómo sacarías los argumentos? No están en un objeto 'StackTraceElement'. –

-1

Se podría escribir un envoltorio para tomar la CLI y volver a dar formato a utilizar -DPROP = VAL

int main(int argc, char*argv[]) 
{ 
std::vector<std::string> in (argv+1,argv+argc), out(); 

out.push_back("java.exe"); 
out.push_back("-cp"); 
out.push_back("my-jar.jar"); 
out.push_back("main.class") 

for(auto it = in.begin(); it!=in.end(); ++in) 
{ 
//process CLI args. turn "-abc","BLAH" into "-Darg.a=true","-Darg.b=true","-Darg.c=BLAH" and push to out 
//Do additional processing. Maybe evn use get_opt() or Boost.ProgramOptions 
} 
//use exec or CreateProcess to launch java with the proper args 
//or even use something like WinRun4J's methods to load the jvm.dll 
//Then your program shows up as "MyExe.exe" instead of "java.exe" 

//Use System.getProperty("arg.a","false") to get the value of a 
} 

Por supuesto, siempre se puede simplemente decirle a los usuarios para invocar un script bash/lote con el adecuada DA = verdaderos argumentos de tipo

8

siguiente expresión es exactamente lo que quiere:

System.getProperty ("sun.java.command")

+1

Esto funciona solo algunas veces, ya que no se trata de una propiedad que esté garantizada. No confiaría en esto solo. Generalmente, desde una perspectiva de diseño, almacenar los valores en algún lugar es mejor. – Jochen

Cuestiones relacionadas