2010-05-16 88 views
2

我正在構建一個加載模塊的服務器。每個模塊是一個.jar文件。在jar裏面有模塊需要的所有類。服務器需要讀取jar文件,找到主類(它沒有主要的方法就是使模塊工作但不作爲不同程序的類),構建該類的對象並將其存儲在向量中的模塊,以便它可以訪問特定模塊,具體取決於要完成的工作。如何使用Java加載模塊

我怎麼能這樣做?

至於服務器,它正在監聽和接收請求,但沒有模塊委託工作,因爲我的模塊向量是空的。

回答

2

Here is a network class loader來自Sun的例子。 這應該涵蓋你需要的一切。

一旦你與你的URL原來的URLClassLoader

JAR URL試試這個語法

一個JAR URL的語法是:

jar:<url>!/{entry} 

例如:

jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class 
jar:file:/export/home/faculty/stansif/public_html/java/applets/image/view.jar!/image.gif 

訪問資源

final java.net.URL url = X.class.getResource ("/dir/image.png"); 
final ImageIcon icon = new ImageIcon (url); 

而且看這個網址http://www.javaworld.com/javaworld/javatips/jw-javatip70.html

+0

thx這個鏈接:D 現在一些問題,即時試圖從本地計算機加載一個罐子裏面的jar theres兩個包se.modules,se.protocol 我想加載模塊裏面的se。模塊包,我的網址應該怎麼樣?: file:///home/me/SE.jar 或file:///home/me/SE.jar!/ se/modules/ 很好,我試過了沒有工作:/所以我認爲是我給loadClass方法的類的名稱...名稱是Module,所以loadClass方法應該像這樣工作: Class c = loadClass(「Module」); 但不工作:S – gerardorn 2010-05-16 23:25:18

+1

@gerardom試試這個http://sourceforge.net/projects/jumperader/ – 2010-05-16 23:31:51

+0

uhmm thx與這段時間的生病鬥爭 – gerardorn 2010-05-16 23:47:36

1

你應該看看現有的框架,包括一個輕量級的OSGi容器。然而,採取的一般方法是爲每個模塊創建類加載器,並使用Reflection或通用API調用每個模塊 - RunnableCallable是兩個很好的候選者。

+0

uhm每個模塊的類加載器?我希望如果所有的模塊用每個子類重新定義的方法doJob()擴展一個Module類,就足以構建一個裝載器並使其通用。你怎麼想? – gerardorn 2010-05-16 23:28:47

+0

有三個很好的理由具有用於每個模塊的單獨的類加載器: 1.允許動態地加載與運行時 卸載模塊2提供了不同的模塊的單身 3之間絕緣防止意外類衝突 唯一的缺點如果您不使用共享的二進制文件構建共享的父類加載器,那麼多個類加載器會導致更多的內存消耗。 我再次建議尋找OSGi容器 - 做這種事情就是他們的麪包和黃油。 – 2010-05-17 19:51:46