2

可能重复:
从 JAR 作为 InputStream 加载?

我是否可以从输入流(例如,从 url 连接)加载 jar 文件,将其加载到类加载器中并执行它?谢谢你的时间。

4

2 回答 2

4

是的; 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)。

于 2012-12-19T05:26:20.070 回答
1
   public static URL getJarUrl(final File file) throws IOException {
        return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/");
    }

这可以正确获取 Lib 的 URL,因为 Jar 文件在尝试获取它们的 URL 时会做一些奇怪的事情。

于 2012-12-19T05:29:57.403 回答