2011-03-29 38 views
5

Hola chicos. Estoy trabajando en un programa en Java diseñado para ser utilizado en un entorno Linux que crea un nuevo proceso Java que ejecuta otra clase Java, pero estoy teniendo problemas con él. Finalmente arreglé todos mis problemas hasta esto. InvocandoJava Runtime.exec problemas en Linux

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" }) 

en mi programa Java vuelve

/bin/bash: /usr/lib/jvm/java-6-openjdk/jre/bin/java -classpath /home/kevin/workspace/Misc/bin HelloWorld: No such file or directory 

, ya sea en stdout/stderr. Si intento

Runtime.getRuntime().exec(new String[] { "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'" }) 

recibo una excepción de Java

Cannot run program "/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'": java.io.IOException: error=2, No such file or directory 
    ... 
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory 

Y, por último, el uso de un simple

Runtime.getRuntime().exec("/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld'") 

me da un

-classpath: -c: line 0: unexpected EOF while looking for matching `'' 
-classpath: -c: line 1: syntax error: unexpected end of file 

de stdout/stderr.

Mientras tanto, la creación de una nueva línea de .sh un archivo (y asignar permisos adecuados) con sólo esto (sin #!/Bin/bash en la parte superior del archivo)

/bin/bash -c 'java -classpath /home/kevin/workspace/Misc/bin HelloWorld' 

da el resultado correcto con sin errores.

Entiendo que el uso de Runtime.exec es bastante complicado de perfeccionar, y ya resolví algunos problemas importantes que tuve antes, pero este problema simplemente me desconcierta (como el uso de Runtime.exec de StringTokenizer atornillando cualquier comandos que tienen espacios en ellos, por lo que invoqué la sobrecarga que acepta matrices de cadenas). Sin embargo, sigo teniendo problemas y no entiendo por qué.

Respuesta

11

Su primer intento fue casi correcto.

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "java -classpath /home/kevin/workspace/Misc/bin HelloWorld" }) 

que no es necesario citar el extra, ya que pasa individuales String argumentos cita efectivamente de forma automática.

+2

Señor, usted es el mejor. ¡No puedo creer que la respuesta sea así de simple! Muchas gracias, nunca hubiera pensado hacer algo así. –

Cuestiones relacionadas