Java重生过程

时间:2010-06-15 14:47:26

标签: java process jvm exec multiprocessing

我正在编写一个类似编辑器的程序。如果用户在主窗口中选择File-> Open,我想以所选文件名作为参数启动编辑器进程的新副本。但是,为此,我需要知道用于启动第一个进程的命令:

java -jar myapp.jar blabalsomearguments // --- need this information
> Open File (fileUrl)
> exec("java -jar myapp.jar blabalsomearguments fileUrl");

我不是在寻找进程内解决方案,我已经实现了。我想拥有独立流程带来的好处。

3 个答案:

答案 0 :(得分:1)

因为你正在推出Java - >在Java中,您可以使用现有的类路径在命令行上设置类路径。这种类型的东西在开发环境中也非常好用。

ProcessBuilder selfLauncher = new ProcessBuilder(
 "java", "-cp", System.getProperty("java.class.path"),
 "com.my.mainClass" );
selfLauncher.start();

<强>更新 对于可执行jar文件,您将拥有一个类路径,它只是jar文件本身的相对路径。如果需要命令行参数,则必须将它们保存在main中,并在启动时重新应用它们。

您可以通过将以下程序打包到jar中来看到这一点。我真的不确定如果你在可执行jar文件中有jar,会发生什么。它们可能出现在类路径中。

public class TestJarPath {
    public static void main(String args[]) throws Exception {
        for (String s : args)
         System.out.print("[" + s + "] ");
        System.out.println();

        String cp = System.getProperty("java.class.path");
        for (String s : cp.split(";"))
          System.out.println(s);
    } 
}

对于java -jar ..\tst.jar X,您会得到如下输出:

[X]
..\tst.jar

答案 1 :(得分:0)

如果所有其他方法都失败了,请尝试编写批处理/ shell脚本来启动您的应用。在Windows中,您可以将%CmdCmdLine%传递给Java以获取整个命令行。

请参阅http://www.robvanderwoude.com/parameters.php

答案 2 :(得分:0)

据我所知,没有可移植的方法来获取此信息。我在gcj运行时发现了一个属性,但我怀疑它会覆盖很大一部分用户。

我认为接受的做法是“尝试并祈祷”:

希望它在路径上,(路径可用,因此可以检查)

如果没有,检查是否定义了JAVA_HOME,并使用它来查找java。

如果没有检查所有操作系统上最可能的位置,那么您已收到错误报告。

嗯,这很麻烦......最好检查JAVA_HOME和路径,并要求用户在失败的情况下明确配置JVL。