在Javas Runtime.exec()中使用动态路径

时间:2014-10-11 19:23:50

标签: java exec processbuilder

我编写了一个Java应用程序,现在编译成jar。在应用程序main方法中,我希望有以下内容:

Runtime.exec("java -jar myapp.jar arg1 arg2"))

(或者,如果它更好,可以使用Processbuilder)

即。应用程序应该自行分叉并创建新进程。

到目前为止,这么好......我现在的问题是我认为我不能只是打电话给#34; java"但我必须提供java目录的完整路径,我还认为我必须提供myapp.jar的完整路径。

有没有办法避免硬编码完整路径?即在Runtime.exec中的运行时推断出java路径和myapp.jar的路径?

此外,应用程序是否可以在运行时推断其名称?即应用程序名称是myapp.jar,但我不想在Runtime.exec(...)中对其进行硬编码。

编辑:我在Ubuntu上需要它,但也在Windows中运行。

1 个答案:

答案 0 :(得分:1)

选项1

使用Runtime.getRuntime().exec

Process proc = Runtime.getRuntime().exec(new String[] {"java","-jar","myapp.jar","arg1","arg2"});

执行getRuntime()应该推断Java可执行文件的位置。

选项2

使用ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("java","-jar","myapp.jar","arg1","arg2");
Process p = pb.start();

如有关环境的文档中所述:初始值是当前流程环境的副本(请参阅System.getenv())。

选项3

将文件加载到类路径中,然后直接调用main方法:

File file = new File("/path/to/myapp.jar");    
JarFile jarFile = new JarFile(file);  
Manifest manifest = jarFile.getManifest();
if (manifest != null) {
    Attributes attributes = manifest.getMainAttributes();  
    String className = attributes.getValue(Attributes.Name.MAIN_CLASS);
    URLClassLoader loader = new URLClassLoader(new URL[] { file.toURI().toURL() }); 
    Class<?> cls = loader.loadClass(className);
    Method main = cls.getDeclaredMethod("main", String[].class);  
    String[] args = {"arg1", "arg2"};  
    main.invoke(null, args); // static methods are invoked with null as first argument
} else {
    System.err.println("Cannot run " + file);
}