2011-05-30 80 views
2

我試圖評估是否適合我們的商店在不使用整個NetBeans平臺的情況下使用NetBeans Lookup API。在NetBeans平臺之外使用Lookup API

到目前爲止,我設法創建這個代碼的項目:

for (SomeInterface si : Lookup.getDefault().lookupAll(SomeInterface.class)) { 
    si.doSomething(); 
} 

我也創造了一些其他的項目,每個實施SomeInterface的AnImplementation類,並隨附文件META-INF /服務/path.to.SomeInterface包含一個引用該類的行(例如「other.path.to.AnImplementation」)。

當我將這些實現項目添加到NetBeans IDE中主項目的庫(依賴項)時,它工作正常,我可以從兩個實現中看到doSomething()的連續結果。

我的問題是如何做到這一點,而不需要引用主項目中的子項目;子項目的罐子在建造時不會被包括在主項目的生成罐子中,並且可以隨意添加或移除它們,從而改變上述代碼的結果。

如果我沒有弄錯,這是Lookup API文檔中公佈的行爲。 在此先感謝。

編輯:現在,我的結論是,沒有NetBeans平臺(或OSGi?),無法檢測啓動時存在哪些服務提供程序。您需要在類路徑中引用它們的jar,並在啓動之前識別它們。隨意證明我錯了。

回答

1

在我的理解中,您不必將所有模塊與主項目捆綁在一起就可以工作。您只需確保在啓動應用程序時模塊位於類路徑中,因爲全局Lookup使用ServiceLoader機制。根據您的問題,我建議使用的ServiceLoader直接是你的問題或更好的匹配考慮,如果

  • Guice一些DI框架是值得一試或
  • 如果OSGI提供一些有用的東西給你的好,並使用它。

不要誤會我的意思,我單獨使用Lookup絕對喜歡的NetBeans和NetBeans平臺,但在我看來是因爲上面列出的可能性有限使用。

+0

感謝您的反饋意見。我們也會考慮ServiceLoader,但是它對JDK6的限制可能不適合我們的要求。 DI框架將被使用,但如果我理解的很好,它需要知道哪些類在開發/打包時可用。我試圖在這裏測試的用例是一個應用程序,它可以在某個「模塊」jar有或沒有的時候同樣工作,並自適應。 – Manur 2011-05-31 07:32:42

+0

查找在serviceLoader之前存在,因此您可以在java 1.4上使用它。 – 2011-05-31 07:44:51

+0

@Tim我知道,我只是認爲這是不是一個爭論,現在甚至1.5甚至被棄用。但是你是對的,如果你爲生活編寫軟件,你必須處理......有趣的設置。 – Waldheinz 2011-05-31 09:00:26

3

您必須在調用應用程序中引用子項目,因爲這會將其放在類路徑上 - 如果jar /庫不在類路徑中,那麼類似Lookup和ServiceLoader的API將無法找到它。

如果您使用OSGI或NetBeans平臺,則這些系統允許您在運行時更改類路徑。

Geertjans blog有大約正是這個條目(使用NetBeans平臺外的查詢API),在他的博客中,他還引用John O'Connors blog其對比了的ServiceLoader和查找的API

編輯

我我剛剛看到Jon Skeets'答案爲similar question。 您可以使用-Djava.ext.dirs=lib屬性將文件夾(在本例中爲'libs')設置爲必須爲您的類路徑查找jar的位置。

+0

我嘗試使用[John O'Connors博客](http://java.sun.com/developer/technicalArticles/javase/extensible/index.html)進行測試。 – Manur 2011-05-31 14:31:11

+0

(對不起)...在DictionaryService/DictionaryUser項目中,我創建了一個lib /文件夾(在項目根級別)。我在項目類路徑中添加了lib /,這要歸功於屬性>添加JAR或文件夾。我在lib /中複製了GeneralDictionary.jar。但是這個服務提供者沒有被檢測到...... – Manur 2011-05-31 14:39:15

+1

這很容易讓人誤解 - NetBeans不允許你只引用一個文件夾,你必須引用所有你想使用的jar。可以從命令文件執行此操作,但有一點需要注意的是,您不能使用java -jar啓動應用程序,您的語法必須是java -cp lib/*; yourapplication.jar com.my.example。 StartApp – 2011-05-31 17:58:24