要麼存在於Apache的百科全書Exec的一個bug,或我使用的API錯誤,但是當我使用CommandLine
類添加包含空格的說法,一些報價相加,然後被賦予參數的一部分。Apache Commons Exec爲包含空格的參數產生太多引號?
例如:當我打電話java "what version"
我得到java.lang.NoClassDefFoundError: what version
,當我打電話java "\"what version\""
(其中包含轉義引號,是命令行參數本身的一部分),我得到java.lang.NoClassDefFoundError: "what version"
。
所以下面的測試失敗,因爲你可以在最後一行看到,阿帕奇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使這個爲公共EXEC已備案的錯誤。
令人難以置信的是,這還沒有得到解決 - 是否沒有人使用commons-exec與實際需要引用的論據? – Miles 2012-12-19 02:15:26