java - Apache Commons Exec 为包含空格的参数生成太多引号?

标签 java apache-commons-exec

Apache Commons Exec 中存在错误,或者我使用的 API 有误,但是当我使用 CommandLine 类添加包含空格的参数时,添加了一些引号,然后给出的论证的一部分。

例如:当我调用 java "what version" 时,我得到 java.lang.NoClassDefFoundError: what version,当我调用 java "\"什么版本\""(包含转义引号,它们是命令行参数本身的一部分),我得到 java.lang.NoClassDefFoundError: "what version"

所以下面的测试失败了,因为正如你在最后一行看到的,Apache Exec 在它应该生成第一个版本的地方生成了后一个版本:

@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));
}

现在我想知道:

  • 这是一个错误吗?
  • 如果是这样:是否有办法规避此问题(解决方法)?
  • 如果不是:我做错了什么?

编辑:我正在尝试执行一个我认为最少的人会在他们的机器上执行的过程。所以我改用 java 因为这个命令应该在人们开发 Java 的所有机器上都可用。我的观点是错误的运行时参数被传递给外部进程,包含转义引号,这是不应该的。

编辑:我在 Jira 将其作为 commons exec 的已归档错误.

最佳答案

Apache common exec 具有带有 handleQuoting 标志的 addArgument 方法。 如果它已打开,则会将参数用引号引起来。

默认开启

public CommandLine addArgument(final String argument, boolean handleQuoting) 

关于java - Apache Commons Exec 为包含空格的参数生成太多引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927226/

相关文章:

java - 有什么方法可以使用自定义 BeanWrapper 实现来加载应用程序上下文

java - ObjectInputStream.read() 返回 -1,但 readObject 返回对象

java - apache commons CommandLine 对象是否可以防止命令行注入(inject)?

java - 使用 apache commons-exec 运行 git clone : how to input password?

java - hadoop mapreduce 给出子错误

带有文件 ://only 的 java URI

java - 如何在Java中从命令提示符访问带空格的文件路径

java - 使用 Apache Commons exec 时出现问题

java - 如何在Jedis中启用负载平衡?

java - 不同的输出——在命令行中运行 mathtext 时以及使用 apache-commons-exec 从 java 程序执行该命令时