我正在支持“ jar://” uri方案的环境中运行,并且我想使用JarURLConnection调用该jar中的任何函数。例如:
jar:file:/home/duke/duke.jar!/COM/foo/Main.class
oracle文档说:
JarURLConnection实例只能用于读取JAR文件。使用此类无法获得OutputStream来修改或写入基础JAR文件。
我的问题是:我可以单独使用jar://
方案来运行代码吗?还是只阅读课程内容?
答案 0 :(得分:1)
您不为此直接使用JarURLConnection。相反,您创建一个URLClassLoader并使用它来获取相关的类:
Path jar = Paths.get("/home/duke/duke.jar");
try {
ClassLoader classLoader = new URLClassLoader(
new URL[] { jar.toUri().toURL() });
Class<?> mainClass = Class.forName("com.foo.Main", true, classLoader);
mainClass.getMethod("main", String[].class).invoke(null, new String[0]);
} catch (ReflectiveOperationException | MalformedURLException e) {
throw new RuntimeException("Could not run " + jar, e);
}
URLClassLoader在内部使用JarURLConnection,但您无需直接使用它。