可能是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)上。 问题答案: 您可以将所有这些组合成一个命令: 这将处理文件名和目录中带有空格的内容。您可以用来获取区分大小写的结果。 注意:传递给的标志阻止它处理以选项开头的文件