在 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
命令输出其帮助消息的原因!)
我正在尝试从我的 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
命令输出其帮助消息的原因!)