O bien hay un error en Apache Commons Exec, o estoy usando el API incorrecto, pero cuando uso la clase CommandLine
para agregar un argumento que contiene espacios, se agregan algunas comillas y luego son parte del argumento que se da.Apache Commons Exec produce demasiadas citas para los argumentos que contienen espacios?
Por ejemplo: Cuando llamo java "what version"
me sale java.lang.NoClassDefFoundError: what version
, y cuando llamo java "\"what version\""
(que contiene comillas escapadas, que forman parte de la línea de comandos argumento en sí), me sale java.lang.NoClassDefFoundError: "what version"
.
Así que la siguiente prueba falla, ya que como se puede ver en la última línea, Apache Exec está produciendo esta última versión en la que se debería haber producido la primera versión:
@Test
public void testArgumentQuoting() throws Exception {
DefaultExecutor executor = new DefaultExecutor();
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
ByteArrayOutputStream out = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(out, out);
executor.setStreamHandler(streamHandler);
CommandLine cmdLine = new CommandLine("java");
cmdLine.addArgument("what version");
executor.execute(cmdLine, resultHandler);
resultHandler.waitFor();
String resultPattern = "Exception in thread \"main\" java\\.lang\\.NoClassDefFoundError: ([\\w \"]+)";
Pattern pattern = Pattern.compile(resultPattern);
Matcher matcher = pattern.matcher(out.toString());
Assert.assertTrue(matcher.find());
// Note: Result should be <what version> and NOT <"what version">!
Assert.assertEquals("what version", matcher.group(1));
}
Ahora quiero saber:
- ¿Esto es un error?
- En caso afirmativo: ¿Hay alguna forma de eludir este problema (una solución)?
- Si no: ¿Qué estoy haciendo mal?
Editar: Estoy tratando de ejecutar un proceso que creo que la menor cantidad de gente tendrá en su máquina. Así que estoy usando java
, ya que este comando debería estar disponible en todas las máquinas donde las personas desarrollen Java. Mi punto es que el argumento de tiempo de ejecución incorrecto se pasa al proceso externo, que contiene citas escapadas, que no debería.
Editar: Hice esto un error archivado para el ejecutivo de los comunes en Jira.
Increíble que esto no se haya solucionado, ¿nadie usa commons-exec con argumentos que realmente necesitan una cotización? – Miles
@Miles commons-exec es horrible cuando se trata de presupuestos, y nadie lo arreglará. También estoy desconcertado por qué nadie usa commons-exec, dada la falta de alternativas. ¿Realmente todos RYO rompe las envolturas de ProcessBuilder? Hablando de eso, ¿por qué no se diseñó ProcessBuilder correctamente en primer lugar? ¿Tal vez nadie usa Java para generar procesos? –