我需要从我的 Java 程序启动第二个 Java 进程,并且分叉进程的参数之一需要包含文字双引号字符 ( "
)。我如何以可移植的方式做到这一点,即它至少可以在 Linux 和 Windows 上运行?
我尝试使用带有字符串数组作为命令行的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)
然后失败。
我发现我可以通过\"
在需要"
ie的参数中添加 a 来使其在 Windows 上运行
commandLine.add("Q:select(x | x.id == \"org.eclipse.sdk.ide\")".replace("\"", "\\\""));
但这破坏了 Linux 上的调用(正如 morgano 所证实的那样)。所以我不得不再次检测操作系统。真的没有简单、可移植的方式来在 Java 中启动一个参数正是字符串数组的内容的进程吗?