在 Windows 上克隆 java 应用程序

Cloning java application on Windows

我正在尝试从我的 javafx 应用程序中使用 Runtime.exec() 启动一个新进程。 新进程是我的 javafx 应用程序(但在新进程中,"parent" 仍将打开)。

所以我 运行 javaw 通过 exec 方法告诉它我的类路径。这是我的问题:类路径包含空格,所以我需要引用每条路径。但是我在 运行 时间通过 java.class.path 检索路径(因为它是同一个应用程序)。

我是否需要处理字符串并引用所有内容,或者是否有简单的方法让它工作?

代码如下:

public static void startInNewProcess() {
    try {
        Runtime r = Runtime.getRuntime();
        File javaPath = new File(System.getProperty("java.home"), "bin/javaw");
        File classPath = new File(System.getProperty("java.class.path"));
        System.out.println("java loc: " + javaPath.toString());
        System.out.println("classpath: " + classPath);
        Process p = r.exec(javaPath.toString() + " -classpath " + classPath.getPath());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我得到以下字符串作为类路径:

classpath: C:\Users\kwilhelm\git\ResourcePlaner\bin;C:\Program Files (x86)\eclipse\plugins\org.eclipse.fx.ide.css.jfx8_2.0.0.201506111511.jar;C:\Users\kwilhelm\git\ResourcePlaner\lib\itextpdf-5.5.6-javadoc.jar;C:\Users\kwilhelm\git\ResourcePlaner\lib\itextpdf-5.5.6-sources.jar;C:\Users\kwilhelm\git\ResourcePlaner\lib\itextpdf-5.5.6.jar;C:\Users\kwilhelm\git\ResourcePlaner\lib\controlsfx-8.40.9.jar

但是javaw报找不到mainclass的错误"Files",所以无法处理路径中的空格

那么有没有办法获取带引号的类路径? 有更好的解决方案吗?

感谢任何帮助

And here is my problem: the classpath contains whitespaces, so I need to quote every path.

实际上,不,你不知道。

事实上,如果您尝试引用每条路径,很可能会搞砸,因为 exec 不理解 shell 引用。

您实际需要做的是:

    Process p = r.exec(new String[] {javaPath.toString(),
                                     "-classpath",
                                     classPath.getPath()});

这会准确地告诉 exec 命令参数的边界在哪里,因此它不需要尝试(并且失败)自己找出答案。

其实还是不对。您还需要添加:

  • 克隆实例需要的任何其他 JVM 选项,
  • 一个class名字,和
  • class名称后需要的任何参数。

class名称是必填项。 (你遗漏了它,这就是 java 命令输出其帮助消息的原因!)