Java Runtime.getRuntime () Illegal argomento Exception
-
13-09-2019 - |
Domanda
Sto avendo alcuni problemi con ricevendo il .getruntime.exec () per funzionare correttamente. Ecco il codice che fare con quella parte:
while (line != null)
{
String name = line;
String commandFull = commandFirst + name + commandLast;
String[] fullCommand = new String[] {commandFirst, name, commandLast};
for(int i=0;i<3;i++)
{
System.out.print(fullCommand[i]);
}
Runtime runner = Runtime.getRuntime();
Process p = runner.exec(fullCommand);
outFile.println(fullCommand);
line = inFile.readLine();
}
esso stampa il comando come dovrebbe apparire. Quando eseguo il programma ecco l'output:
adfind -b dc=stuff,dc=com -f "cn=user" |find "displayName" >> fullList.txt
Exception in thread "main" java.lang.IllegalArgumentException
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at lookup.main(lookup.java:41)
Soluzione
Si sta tentando di eseguire un comando di shell senza il guscio.
Cioè, si sta cercando di eseguire qualcosa che un guscio interpreterebbe (in particolare il tubo di '|'
e aggiungere '>>'
). Per risolvere questo problema, ha Java eseguire un'istanza shell e passare l'intero comando alla shell. Come questo dovrebbe funzionare dipende dalla piattaforma.
Per esempio, in Linux:
String fullCommand = {"/bin/sh", "-c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};
o in Windows:
String fullCommand = {"cmd.exe", "/c", "find -b dc=stuff,dc=com -f \"cn=user\" |find \"displayName\" >> fullList.txt"};
Altri suggerimenti
I redirezione e di pipe non funzionano - non sono una parte del comando, ma si basano sul guscio sottostante da valutare quando si esegue questa linea da e. g. una finestra cmd.exe.
Sarà necessario utilizzare i flussi di ingresso e di uscita degli oggetti di processo che si ottiene dal metodo exec ().
Se la vostra preoccupazione principale è quello di query in Active Directory, non si utilizza lo strumento di query specifica a portata di mano, si dovrebbe considerare l'idea di una soluzione all-Java. Ci sono diversi modi per accedere alle directory LDAP (che Active Directory è anche), per esempio qui:
http://developer.novell.com/wiki/index.php/Jldap
Non ho ancora usato io stesso, tuttavia non sembra abbandonato in quanto vi sono uscite dal 2008.
Credo che la "append" (>>) e la "pipe" (|) non sono ammessi.
Si potrebbe provare dando ogni elemento un posto nella matrice:
String [] command = {"adfind" "-b" "dc=stuff,dc=com" "-f" "cn=user" "|" "find" "displayName" ">>" "fullList.tx" }
e vedere cosa succede.
Come altri hanno fatto notare, non è possibile eseguire il reindirizzamento stdout / err tramite istruzioni di shell, in quanto non si dispone di una shell.
Sarà necessario consumare output / error in thread separati, per evitare il blocco. Vedi questa risposta per ulteriori informazioni.
Alla fine (e sì, questo è stato un po 'un modo rapido e sporco) ho finito per chiamare un file .bat che ha eseguito il comando e ha usato le tubazioni e reindirizzamenti. Sono sicuro che non è la soluzione migliore, ma funziona per quello che mi serve.