2012-12-19 236 views
3

可能重复:
Loading from JAR as an InputStream?从InputStream加载外部.jar文件

是否有可能对我来说,加载从输入流的jar文件(从一个URL连接,例如),将其加载到类加载器中,然后执行它? 谢谢你的时间。

+0

如何将外部jar文件嵌入到您的主jar文件中 –

+0

@NidhinKrishnan在运行时加载类是插件的常态。 – Vulcan

+0

@Vulcan我的意思是我们可以通过改变build.xml中的一些代码来将外部jar与我们的主应用程序jar结合起来。例如,如果我们的应用程序需要mysql.jar,并且清除并构建应用程序库时,它们将保存在单独的lib文件夹中。我们可以通过更改build.xml中的一些代码来防止这种情况,并且我们可以将主jar文件中的所有库合并在一起。 –

回答

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)。

+0

我最终将jar全部加载到内存中。这花了一些时间,但它更适合我所需要的。谢谢! – user1681891

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

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