可能重复:
从 JAR 作为 InputStream 加载?
我是否可以从输入流(例如,从 url 连接)加载 jar 文件,将其加载到类加载器中并执行它?谢谢你的时间。
可能重复:
从 JAR 作为 InputStream 加载?
我是否可以从输入流(例如,从 url 连接)加载 jar 文件,将其加载到类加载器中并执行它?谢谢你的时间。
是的; URLClassLoader
旨在用于此目的。它可以从 URL 数组加载类。
URL externalJar = new URL("http://example.com/app.jar");
URL localJar = new URL("C:/Documents/app.jar");
URLClassLoader cl = new URLClassLoader(URL[]{ externalJar, localJar });
Class<?> clazz = cl.loadClass("SomeClass"); // you now can load classes
如果您InputStream
不是基于 a URL
,则可以改为将流的内容写入一个临时 jar 文件,然后使用上述方法加载该文件。(您可以将 jar 完全加载到内存中,这意味着不会创建临时文件,但此方法需要付出更多努力才能正确完成,因为您需要定义自定义 ClassLoader)。
public static URL getJarUrl(final File file) throws IOException {
return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/");
}
这可以正确获取 Lib 的 URL,因为 Jar 文件在尝试获取它们的 URL 时会做一些奇怪的事情。