我编写了一个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中运行。
答案 0 :(得分:1)
Process proc = Runtime.getRuntime().exec(new String[] {"java","-jar","myapp.jar","arg1","arg2"});
执行getRuntime()应该推断Java可执行文件的位置。
ProcessBuilder pb = new ProcessBuilder("java","-jar","myapp.jar","arg1","arg2");
Process p = pb.start();
如有关环境的文档中所述:初始值是当前流程环境的副本(请参阅System.getenv()
)。
将文件加载到类路径中,然后直接调用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);
}