我正在構建一個加載模塊的服務器。每個模塊是一個.jar
文件。在jar裏面有模塊需要的所有類。服務器需要讀取jar文件,找到主類(它沒有主要的方法就是使模塊工作但不作爲不同程序的類),構建該類的對象並將其存儲在向量中的模塊,以便它可以訪問特定模塊,具體取決於要完成的工作。如何使用Java加載模塊
我怎麼能這樣做?
至於服務器,它正在監聽和接收請求,但沒有模塊委託工作,因爲我的模塊向量是空的。
我正在構建一個加載模塊的服務器。每個模塊是一個.jar
文件。在jar裏面有模塊需要的所有類。服務器需要讀取jar文件,找到主類(它沒有主要的方法就是使模塊工作但不作爲不同程序的類),構建該類的對象並將其存儲在向量中的模塊,以便它可以訪問特定模塊,具體取決於要完成的工作。如何使用Java加載模塊
我怎麼能這樣做?
至於服務器,它正在監聽和接收請求,但沒有模塊委託工作,因爲我的模塊向量是空的。
您應該使用Java的ServiceLoader類,
http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html
這需要你的JAR在META-INF/services目錄供應商配置文件。這是使用Java加載模塊的標準內置方法。如果您需要更強大的模塊加載,您可能需要查看OSGi。
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
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
@gerardom試試這個http://sourceforge.net/projects/jumperader/ – 2010-05-16 23:31:51
uhmm thx與這段時間的生病鬥爭 – gerardorn 2010-05-16 23:47:36
你應該看看現有的框架,包括一個輕量級的OSGi容器。然而,採取的一般方法是爲每個模塊創建類加載器,並使用Reflection或通用API調用每個模塊 - Runnable
和Callable
是兩個很好的候選者。
uhm每個模塊的類加載器?我希望如果所有的模塊用每個子類重新定義的方法doJob()擴展一個Module類,就足以構建一個裝載器並使其通用。你怎麼想? – gerardorn 2010-05-16 23:28:47
有三個很好的理由具有用於每個模塊的單獨的類加載器: 1.允許動態地加載與運行時 卸載模塊2提供了不同的模塊的單身 3之間絕緣防止意外類衝突 唯一的缺點如果您不使用共享的二進制文件構建共享的父類加載器,那麼多個類加載器會導致更多的內存消耗。 我再次建議尋找OSGi容器 - 做這種事情就是他們的麪包和黃油。 – 2010-05-17 19:51:46
這工作就像一個魅力,thx – gerardorn 2010-05-20 01:59:09