2010-03-29 23 views
13

Desde Java, ¿es posible obtener la línea de comando completa con todos los argumentos que iniciaron la aplicación?¿Cómo obtengo la línea de comandos que inició el proceso?

System.getEnv() y System.getProperties() no parecen contener los valores.

+2

¿te refieres a los argumentos proporcionados a la jvm también? hay una pregunta relacionada con eso http://stackoverflow.com/questions/1490869/how-to-get-vm-arguments-from-inside-of-java-application – LB40

Respuesta

12

Parte de ella está disponible en el RuntimeMXBean se obtiene llamando a ManagementFactory.getRuntimeMXBean()

A continuación, puede, por ejemplo, llamar a

Los javadocs para los que dicen:

devuelve los argumentos de entrada pasados a la máquina virtual Java que no incluye los argumentos para el método principal. Este método devuelve una lista vacía si no hay un argumento de entrada para la máquina virtual Java.

Algunas implementaciones de Java Virtual Machine puede tomar argumentos de entrada de múltiples fuentes diferentes: por ejemplo, argumentos pasados ​​desde la aplicación que pone en marcha la máquina virtual de Java como el comando 'java', variables de entorno, archivos de configuración, etc.

Normalmente, no todas las opciones de línea de comandos para el comando 'java' se pasan a la máquina virtual Java. Por lo tanto, los argumentos de entrada devueltos pueden no incluir todas las opciones de línea de comandos.

+2

Creo que esto es lo mejor que puedes obtener usando Java puro. – msandiford

+0

+1 Un código de ejemplo me gustaría esto perfecto! :) – OscarRyz

+0

@Stephen Denne ... No soy un fan de este. Mi comprensión de la pregunta era obtener la línea de comando (di lo que se muestra en 'ps -f' con la cadena de comandos. Como dice la página del manual," _no incluye los argumentos en el método principal._ "En este momento, yo ' Estoy tratando de determinar qué otro programa está pasando a un 'main' que no es visible para mi clase. – will

1

En Linux/UNIX que debería ser posible cuando llegue a la salida de ese comando (correr en una cáscara)

cat /proc/$PPID/cmdline 

Pero eso no es portátil en absoluto y por lo tanto no debe usarse en Java .. .

+0

Ok, gracias. Está bien si no es portátil, sin embargo, también necesito que funcione en Windows. – aksamit

+2

@aksamit - en otras palabras, necesitas que sea portátil entre (al menos) Linux y Windows ... ¡duh! @Johannes - "por lo tanto, no debería usarse en Java" es demasiado fuerte. No es totalmente incorrecto escribir código no portátil en Java ... si las circunstancias lo requieren. –

+0

@Johannes Weiß: por lo que Sun estaba fuera de sí cuando decidieron poner * Runtime.exec * en ¿verdad? Quiero decir, obviamente no sirve para nada y debería eliminarse del lenguaje para complacer a los "dioses puros de Java". O? – SyntaxT3rr0r

1

Los siguientes enlaces pueden ayudar a llegar allí:

How to get command line arguments for a running process

get command-line of running processes

How to get a list of current open windows/process with Java?

Así como una nota:

En Windows que tenga Process Explorer by Sysinternals que muestra la línea de comandos que se utiliza para abrir el proceso. Haga clic con el botón derecho en el proceso y seleccione Propiedades ... Verá la línea de comando en la ventana que se abre.

0

Es posible que desee ver cómo jps hace esto. Es un programa de Java que puede obtener la línea de comando completa para todos los procesos de Java, incluido el nombre de clase completo de la clase principal y las opciones de JVM.

0

Una opción que he usado en el pasado para mantener el brillo de plataforma cruzada es establecer la línea de comando como una variable de entorno antes de emitir el comando.

1

Hay una variable de entorno% ~ dp0 que devuelve la ruta completa

+1

¿En qué sistema operativo? – OscarRyz

+1

Vaya ... Olvidé que está en Windows. Muy útil para ejecutar el cambio a la ruta UNC para un archivo por lotes. Por ejemplo, ruta UNC \\ Server \ share \ folder1 \ runit.bat si se pulsa la primera línea del lote% ~ dp0, entonces su ruta actual será \\ Server \ share \ folder1 \ – ggonsalv

+0

La respuesta no es relevante para el motivo por el que encontré esta pregunta, pero es útil saberlo. –

0

Tenga una mirada en YAJSW (Sin embargo, otro contenedor de servicio de Java) - tiene implementaciones basadas en JNA para diversos sistemas operativos (incluyendo Win32 y Linux) que haga exactamente esto para que pueda tomar la línea de comando de un proceso en ejecución y crear una configuración que lo envuelva en un servicio. Un poco más de información here.

0

Si está utilizando Solaris como el sistema operativo, eche un vistazo a la utilidad "pargs". Imprime toda la información requerida.

Cuestiones relacionadas