我想在运行的Java应用程序中运行一个可运行的jar存档。 我需要能够从我的应用程序中控制正在运行的类(即停止,启动它们等)。
基本上我需要做“java -jar X.jar”的eqvilient。
我无法使用Runtime.getRuntime()。exec(“...”),因为jar文件将被编码,并且需要先解码它们。
答案 0 :(得分:9)
以下是使用Main-Class
从jar文件中提取JarFile
的名称然后使用URLClassLoader
从jar加载类然后调用static void main
的示例使用反射:
package test;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
public class JarRunner {
public static void main(String[] args) throws Exception{
File jar = new File(args[0]);
URLClassLoader classLoader = new URLClassLoader(
new URL[]{jar.toURL()}
);
JarFile jarFile = new JarFile(jar);
Attributes attribs = jarFile.getManifest().getMainAttributes();
String mainClass = attribs.getValue("Main-Class");
Class<?> clazz = classLoader.loadClass(mainClass);
Method main = clazz.getMethod("main", String[].class);
main.invoke(null, new Object[]{new String[]{"arg0", "arg1"}});
}
}
答案 1 :(得分:4)
'可执行文件夹'是一个简单的jar文件,其中清单有一个特殊属性,用于定义'主'类。
因此,您只需将可执行jar放在类路径上,识别'main'类并调用此类的静态main方法。