当前位置: 首页 > 面试题库 >

Apache Commons Exec对包含空格的参数产生过多的引号吗?

臧威
2023-03-14
问题内容

可能是Apache Commons
Exec中有一个错误,或者我使用的API错误,但是当我使用CommandLine该类添加包含空格的参数时,会添加一些引号并将其包含在给出的参数中。

例如:当我打电话给java "what version"我时java.lang.NoClassDefFoundError: what version,当我打电话给我java "\"what version\""(它包含转义引号,这是命令行参数本身的一部分)时,我得到了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 Commons
Exec中的一个实际错误,迄今为止尚未修复。



 类似资料:
  • 问题内容: 任何人都可以进行以下跑步吗? 使用Java6。已在Vista x64下测试。顺便说一句,获取执行的字符串(必须使用exec的String版本来获取它)并在Vista的开始菜单的“ 搜索” 字段中使用它会按预期运行。 任何帮助将不胜感激。我疯了..! 更新:我为我的帖子指出的第二个奇怪的问题添加了一个解决方案,即exec的两个版本的行为不同。该解决方案基于修剪的答案。再次感谢。 问题答案

  • 问题内容: 当检测到未经训练的购物者输入信用卡/借记卡卡号时,某些高档网站会显示错误对话框,因为该密码印在其卡上带有空格。是否可以通过某种方式编写一个Java Web应用程序来处理这些带有空格的数字,就好像它们是正确的一样? 问题答案: 我的观点是,任何拒绝带有空格的信用卡号的Web应用程序都无法正常工作。当您收到信用卡号时,这样做很容易: 删除空格和破折号(有些也使用)。然后验证结果。如果您强迫

  • 问题内容: 我有这个下面的代码。 编辑: 这是被称为回调函数的函数: 现在,如果我想将变量作为参数传递给回调函数,是否有办法做到这一点而不必在调用中将其添加为另一个参数?我试图让该函数对其他用法开放,所以我不想传递任何额外的参数;但是如果它可以以某种方式包含在回调中,那就太好了。 问题答案: 将回调更改为匿名函数: 这使您可以将参数传递给内部函数。 编辑:允许ajax响应:

  • 问题内容: 最近又了解了JavaScript计时事件。我注意到一个我从未遇到过的奇怪人物。他们使用双引号,然后调用该函数。 例: 我知道JavaScript中的双引号和单引号表示字符串。 我也看到我可以做同样的事情: 带有括号的是指,没有括号的是复制的。当我使用引号和括号时,它越来越疯狂了。 如果有人可以向我解释这三种使用方式之间的区别,我将感到非常高兴setTimeout: 带括号: 没有引号和

  • 问题内容: 我正在使用ProcessBuilder运行Windows可执行文件…我需要运行的确切命令是: 如果我从命令提示符处运行上述命令,它将正常工作。 然后,如果我按照下面的帖子(ProcessBuilder在命令行中添加额外的引号)中的String []数组的形式发出命令和参数,则它将失败,因为目录路径中的空格以某种方式将参数打断到CCBU.exe可执行文件: 如果我将数据文件和过滤器移动到

  • 问题内容: 我正在尝试在目录下复制一堆文件,并且其中一些文件的名称中包含空格和单引号。当我尝试串起来并用,我得到以下错误: 关于更可靠地使用xargs的任何建议? 这是在具有BSD的Mac OS X 10.5.3 (Leopard)上。 问题答案: 您可以将所有这些组合成一个命令: 这将处理文件名和目录中带有空格的内容。您可以用来获取区分大小写的结果。 注意:传递给的标志阻止它处理以选项开头的文件