从InputStream加载外部Jar文件

时间:2012-12-19 05:19:37

标签: java classloader inputstream

  

可能重复:
  Loading from JAR as an InputStream?

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

2 个答案:

答案 0 :(得分:3)

是; 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不是基于URL,则可以将流的内容写入临时jar文件,然后使用上述方法加载该文件。 (你可以将jar完全加载到内存中,这意味着没有创建临时文件,但是这种方法需要付出相当多的努力,因为你需要定义一个自定义的ClassLoader。

答案 1 :(得分:1)

   public static URL getJarUrl(final File file) throws IOException {
        return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/");
    }

这正确地获取了Lib的URL,因为Jar文件在尝试获取URL时会做一些不稳定的事情。