example ejemplo code java playframework runtime.exec processbuilder

java - ejemplo - ProcessBuilder proporciona un "No existe tal archivo o directorio" en Mac mientras Runtime(). Exec() funciona bien



java process runtime exec timeout (1)

Tengo una aplicación que se ejecuta en Playframework, que necesita codificar algunos archivos de video. solía

Process pr = Runtime.getRuntime().exec(execCode)

para esto (y funciona perfectamente), pero como necesito tanto la secuencia de salida como la de error, estoy tratando de usar ProcessBuilder (como también se recomienda).

Pero no puedo hacerlo funcionar (probando en un MacBook). ¿Hay una diferencia fundamental entre el método Runtime y ProcessBuilder?

Este es mi código para ProcessBuilder (exactamente el mismo código funciona cuando es reemplazado por Runtime.getRuntime().exec() )

String execCode = "/opt/local/bin/ffmpeg -i file [...]"; ProcessBuilder pb = new ProcessBuilder(execCode); pb.redirectErrorStream(true); pb.directory(new File("/Users/[...]/data/")); Process pr = pb.start();

Esta es la salida de la consola:

11:00:18,277 ERROR ~ There was a problem with with processing MediaFile[13] with error Error during coding process: Cannot run program "/opt/local/bin/ffmpeg -i /Users/[...]/data/media/1/1/test.mov [...] /Users/[...]/data/media/1/13/encoded.mp3" (in directory "/Users/[...]/data"): error=2, No such file or directory java.lang.Exception: Error during coding process: Cannot run program "/opt/local/bin/ffmpeg -i /Users/Luuk/Documents/Java/idoms-server/data/media/1/1/test.mov -y -f mpegts -acodec libmp3lame -ar 48000 -b:a 64000 -vn -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate -1 -bufsize -1 -rc_eq ''blurCplx^(1-qComp)'' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -g 30 -async 2 /Users/Luuk/Documents/Java/idoms-server/data/media/1/13/encoded.mp3" (in directory "/Users/Luuk/Documents/Java/idoms-server/data"): error=2, No such file or directory at logic.server.MediaCoder.encodeMediaFile(MediaCoder.java:313) at logic.server.MediaCoder.doJob(MediaCoder.java:54) at play.jobs.Job.doJobWithResult(Job.java:50) at play.jobs.Job.call(Job.java:146) at play.jobs.Job$1.call(Job.java:66) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:680) Caused by: java.io.IOException: Cannot run program "/opt/local/bin/ffmpeg -i /Users/Luuk/Documents/Java/idoms-server/data/media/1/1/test.mov -y -f mpegts -acodec libmp3lame -ar 48000 -b:a 64000 -vn -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate -1 -bufsize -1 -rc_eq ''blurCplx^(1-qComp)'' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -g 30 -async 2 /Users/Luuk/Documents/Java/idoms-server/data/media/1/13/encoded.mp3" (in directory "/Users/Luuk/Documents/Java/idoms-server/data"): error=2, No such file or directory at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) at logic.server.MediaCoder.encodeMediaFile(MediaCoder.java:189) ... 11 more Caused by: java.io.IOException: error=2, No such file or directory at java.lang.UNIXProcess.forkAndExec(Native Method) at java.lang.UNIXProcess.<init>(UNIXProcess.java:53) at java.lang.ProcessImpl.start(ProcessImpl.java:91) at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) ... 12 more


Debe especificar los argumentos como Strings separadas:

new ProcessBuilder("cmd", "arg1", "arg2", ...);

El constructor acepta String , varargs y List<String> .

Ver la documentación de ProcessBuilder .