2012-12-19 159 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時做了一些不可思議的事情。