Apache Commons Exec にバグがあるか、間違った API を使用していますが、CommandLine
クラスを使用してスペースを含む引数を追加すると、いくつかの引用符が追加され、与えられた引数の一部になります。
例: java "what version"
get を呼び出すと、(コマンド ライン引数自体の一部であるエスケープされた引用符が含まれている) を呼び出すと、 get が取得され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 のバグとして報告しました。