2012-01-05 95 views
1

我正在開發一個媒體應用程序,用戶應該能夠在運行時從中央數據庫動態加載工具。這些將主要需要是用於處理音頻和視頻的信號處理模塊。我一直在閱讀有關實現自定義類加載器的內容,但似乎必須知道類的名稱才能使用classLoader。這對我來說並不合適。我希望能夠在應用程序部署完成後構建這些模塊(並可能爲其創建開放一個公共API)。使用接口名稱將jar添加到java應用程序

我想需要的模塊來擴展實現接口的抽象類:

public abstract class AbstractModule implements myInterface{ 
    //.... 
} 

我還沒有知道這些模塊的作者將其命名爲子類中的任何方式..

我已經讀了一些關於osgi的包,看起來很有希望......但是我明顯不想重新設計我的整個架構......是否有可能讓我的應用程序的這部分使用Osgi包?我的感覺不是,因爲看起來Osgi捆綁包需要自己的容器運行。

無論如何,什麼是最好的,最不危險的,最穩定的方式來讓我的applcation動態加載模塊。模塊需要某種標準化(如擴展抽象類)。

謝謝

回答

1

這是OSGI這樣一個美麗的用例。所以我想問題是 - 這是一個桌面應用程序或基於服務器?請注意,可以在桌面上使用OSGI,但如果走這條路線,您的容器選擇將會有所不同。


編輯

對於桌面應用程序,你會最好地利用FelixEclipse Equinox服務。兩者都可以很好地嵌入獨立的富客戶端。對於服務器應用程序,我無法高度推薦JBoss 7。您將得到一個快速的Java EE 6服務器,併爲OSGI模塊提供一流的支持。我仍然不確定您的架構的確切設置,您提到了(豐富的聲音)客戶端和Java EE服務器。你能再詳述一下嗎?

+0

我一直在閱讀這份文件,就像你說的那樣聽起來很美。你能否詳細說明容器的選擇會有何不同?我正在編寫一個多層的java-ee應用程序。 Osgi將不得不運行在通過glassfishes javaws服務部署的ACC中運行的應用程序客戶端(或者可能與其一起)。在快速瀏覽這篇文章之後,它似乎就像實例化一個Felix對象一樣簡單。對不起,我需要了解更多關於osgi是如何工作的(特別是它與容器環境的交互)在下面的鏈接中發佈鏈接 – b3bop 2012-01-05 18:52:09

+0

http://felix.apache.org/site/apache-felix-framework-launching-and-embedding .html#ApacheFelixFrameworkLaunchingandEmbedding嵌入 – b3bop 2012-01-05 18:52:41

+0

我添加了一些細節到我的答案。如果你能詳細闡述你的客戶,我可以更多地縮小選擇的範圍。 – Perception 2012-01-05 19:07:55

0

您將需要掃描類路徑並按類檢查類。
這是一件非常煩人的事情。
檢查Reflections,它將幫助您獲得某些類型的所有子類型,而不需要太多的工作

1

我同意@Perception - 你應該考慮OSGi。沒有意義重新發明輪子。但是,如果您沒有其他選擇:

創建每個模塊需要實現的標準化界面,例如,

public interface ModuleInterface { 
    public String greet(String name); 
} 

模塊的實現看起來是這樣的:

public class MyModule implements ModuleInterface { 

    @Override 
    public String greet(String name) { 
     return "Hi "+name+"!"; 
    } 

} 

然後,您可以在一個jar包這些類(未密封)來創建一個模塊。然後,您的應用程序(包括通用的ModuleInterface類)可以通過執行

URL classUrl = new URL("file:///modules/server/ModuleJar.jar"); 
URL[] classUrls = {classUrl}; 
URLClassLoader ucl = new URLClassLoader(classUrls); 
Class<?> clazz = ucl.loadClass("com.example.MyModule"); 
ModuleInterface firstModule = (ModuleInterface)clazz.newInstance(); 
System.out.println(firstModule.greet("John Doe")); 
0

正如其他人所說,這是一個可愛的OSGi用例。沒有提到的一件是OSGi服務。服務在服務註冊表中註冊,並通過接口名稱查找。如果有多個服務實現相同的接口,則可以返回包含所有這些信息的列表。

您可以以編程方式註冊和訪問服務,但最好使用聲明式服務或藍圖以聲明方式進行。兩者都爲OSGi服務提供簡單的依賴注入。 Blueprint基於spring dm,所以如果你習慣了彈簧,看起來應該很熟悉。如果您使用的是Glassfish,我相信它具有用於注入OSGi服務的不同系統,因此您可以使用它或在您的容器中安裝藍圖實現。

許多應用程序服務器(包括Glassfish,JBoss,Geronimo和WebSphere Application Server)允許您在仍使用Java EE模式(如servlet和JPA)的OSGi容器中運行應用程序。 (如果你想更多的谷歌,Glassfish稱這種混合應用程序,這給你的想法,而其他人稱之爲企業OSGi。)這可能允許你移動到一個很好的乾淨的OSGi解決方案的實施,而無需大量的重新架構。

-

企業OSGi的行動:http://www.manning.com/cummins

3

我不跟其他的答案不同意,當然。

此外,您的一個擔心似乎是關於必須擁有一個OSGi容器。這是事實:Felix(APLv2),Equinox(EPL)和Knopflerfish(BSD)是開源OSGi框架實現的例子。然而,它們非常輕便且可嵌入,事實上,您可以將它們嵌入大約5-10行代碼。我前一段時間寫了blog post這個話題,可能會幫助你開始。

換句話說,沒有必要將您的整個應用程序轉換爲OSGi(儘管您可能想要這樣做是出於其他原因,例如模塊化和可維護性)。您可以在應用程序中創建一個純粹用於加載這些可插入工具的小型OSGi容器。

其他一些雜點:

  • 冬青使用OSGi服務提到,我非常同意。工具包應該發佈應用程序偵聽的服務。
  • 而不是工具包的數據庫,我會推薦使用如OBR等存儲庫技術。這將允許工具和庫之間的依賴關係由解析器進行管理,使開發人員可以更輕鬆地將工具添加到您的平臺中。請注意,如果您願意,OBR存儲庫的物理存儲器仍然可以是RDBMS。