我試圖評估是否適合我們的商店在不使用整個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,並在啓動之前識別它們。隨意證明我錯了。
感謝您的反饋意見。我們也會考慮ServiceLoader,但是它對JDK6的限制可能不適合我們的要求。 DI框架將被使用,但如果我理解的很好,它需要知道哪些類在開發/打包時可用。我試圖在這裏測試的用例是一個應用程序,它可以在某個「模塊」jar有或沒有的時候同樣工作,並自適應。 – Manur 2011-05-31 07:32:42
查找在serviceLoader之前存在,因此您可以在java 1.4上使用它。 – 2011-05-31 07:44:51
@Tim我知道,我只是認爲這是不是一個爭論,現在甚至1.5甚至被棄用。但是你是對的,如果你爲生活編寫軟件,你必須處理......有趣的設置。 – Waldheinz 2011-05-31 09:00:26