2010-03-29 5 views
13

Da Java, è possibile ottenere la riga di comando completa con tutti gli argomenti che hanno avviato l'applicazione?Come ottengo la riga di comando che ha avviato il processo

System.getEnv() e System.getProperties() non sembrano contenere i valori.

+2

intendi gli argomenti forniti anche al jvm? c'è una domanda relativa a tale http://stackoverflow.com/questions/1490869/how-to-get-vm-arguments-from-inside-of-java-application – LB40

risposta

12

Alcuni di essi è disponibile presso il RuntimeMXBean, ottenuta chiamando ManagementFactory.getRuntimeMXBean()

È quindi possibile, ad esempio chiamare

I javadocs per i quali dicono:

Restituisce gli argomenti di input passati alla macchina virtuale Java che non include gli argomenti del metodo principale. Questo metodo restituisce una lista vuota se non ci sono argomenti di input per la macchina virtuale Java.

Alcune implementazioni Java Virtual Machine, possono prendere argomenti di input da più fonti diverse: per esempio, argomenti passati dall'applicazione che lancia la macchina virtuale Java, come il comando 'java', le variabili di ambiente, i file di configurazione, ecc

In genere, non tutte le opzioni della riga di comando del comando 'java' vengono passate alla macchina virtuale Java. Pertanto, gli argomenti di input restituiti potrebbero non includere tutte le opzioni della riga di comando.

+2

Penso che questo sia il meglio che si possa ottenere usando puro Java. – msandiford

+0

+1 Un codice di esempio mi piacerebbe questo !!! :) – OscarRyz

+0

@Stephen Denne ... Non è un fan di questo. La mia comprensione della domanda è stata quella di ottenere la riga di comando (dire cosa mostra in 'ps -f' con la stringa di comando. Come dice la pagina di manuale," _non include gli argomenti per il metodo main._ "Al momento, I ' Sto cercando di determinare quale altro programma sta passando ad un 'main' che non è visibile alla mia classe – will

1

In Linux/UNIX che dovrebbe essere possibile quando si ottiene l'output di quel comando (eseguito in una shell)

cat /proc/$PPID/cmdline 

Ma non è portatile a tutti e pertanto non dovrebbe essere utilizzato in Java .. .

+0

Ok, grazie. Va bene se non è portatile, tuttavia ho bisogno che funzioni anche su Windows. – aksamit

+2

@aksamit - in altre parole, è necessario che sia portatile tra (almeno) Linux e Windows ... duh! @Johannes - "quindi non dovrebbe essere usato in Java" è troppo forte. Non è del tutto sbagliato scrivere codice non portabile in Java ... se le circostanze lo richiedono. –

+0

@Johannes Weiß: così Sun è appena uscito di testa quando ha deciso di inserire * Runtime.exec * nel modo giusto? Voglio dire, ovviamente non serve affatto e dovrebbe essere rimosso dalla lingua per compiacere gli "dei puri di Java"? O ? – SyntaxT3rr0r

1

seguenti link possono aiutare a raggiungerlo:

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?

Proprio come una nota:

In Windows avete Process Explorer by Sysinternals che mostra la riga di comando utilizzato per aprire il processo. Fai clic con il tasto destro del mouse sul processo e seleziona Proprietà ... Vedrai la riga di comando nella finestra che viene aperta.

0

Si potrebbe voler vedere come jps fa questo. È un programma Java in grado di ottenere l'intera riga di comando per tutti i processi Java, incluso il nome completo della classe principale e le opzioni JVM.

0

Un'opzione che ho usato in passato per mantenere il cross-platform-shine è impostare la riga di comando come variabile di ambiente prima di emettere il comando.

1

C'è una variabile d'ambiente% ~ dp0 che restituisce il percorso completo

+1

On ... quale sistema operativo? – OscarRyz

+1

Oops .. Ho dimenticato che è in Windows. Molto utile per eseguire il passaggio al percorso UNC per un file batch. Per esempio percorso UNC \\ Server \ share \ folder1 \ runit.bat se la prima riga del batch è pushd% ~ dp0, il percorso corrente sarà \\ Server \ share \ folder1 \ – ggonsalv

+0

la risposta non è rilevante per il motivo per cui ho trovato questa domanda, ma utile da sapere. –

0

Dai un'occhiata alla YAJSW (Yet Another Java Service Wrapper) - ha implementazioni JNA-based per i vari sistemi operativi (tra cui win32 e Linux) che fare esattamente questo in modo che possa prendere la linea di comando per un processo in esecuzione e creare una configurazione che lo avvolge in un servizio. Un po 'di più informazioni here.

0

Se si utilizza solaris come sistema operativo, dare un'occhiata all'utilità "pargs". Stampa tutte le informazioni richieste.

Problemi correlati