我需要從我的Java程序啓動第二個Java進程,並且分叉進程的參數之一需要包含文字雙引號字符("
) 。我如何以便攜的方式來做到這一點,即至少可以在Linux和Windows上工作?如何使用包含雙引號的參數從Java啓動進程
我試圖用一個ProcessBuilder
(將其引入是爲了克服Runtime
類的問題,是嗎?)與字符串作爲命令行的陣列,但仍然存在與包含報價參數的一個問題:
List<String> commandLine = new ArrayList<String>();
commandLine.add(new File(System.getProperty("java.home") + "/bin/java").getAbsolutePath());
commandLine.addAll(Arrays.asList("-jar", "plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar", "-application", "org.eclipse.equinox.p2.director", "-repository", "http://download.eclipse.org/releases/juno"));
commandLine.add("-list");
commandLine.add("Q:select(x | x.id == \"org.eclipse.sdk.ide\")");
new ProcessBuilder().command(commandLine).directory(eclipseInstallationDir).start().waitFor();
上面的代碼不工作(在Windows上),因爲ProcessBuilder
(或別的東西)吃了在最後一個參數的雙引號:
相反的Q:select(x | x.id == "org.eclipse.sdk.ide")
中,進程收到參數Q:select(x | x.id == org.eclipse.sdk.ide)
,然後失敗。
我想通了,我可以把它用在參數添加\"
工作在Windows上,我需要一個"
即
commandLine.add("Q:select(x | x.id == \"org.eclipse.sdk.ide\")".replace("\"", "\\\""));
但這打破Linux上的調用(如莫爾加諾確認) 。所以我不得不再次檢測操作系統。是否真的沒有簡單的,可移植的方式來啓動Java中的一個進程,其參數恰好是字符串數組的內容?
您的代碼適合我 – morgano
哪一個?有或沒有替換的那個?並在哪個操作系統? – oberlies
第一個(帶字符串「」的問題:select(x | x.id == \「org.eclipse.sdk.ide \」)「') – morgano