[英]Is OSGi fundamentally incompatible with JSR-223 Scripting Language Discovery?
我最近編寫了一種小型專業腳本語言,並使用 Maven 導出符合 OSGi 的包,該包還將服務描述符導出到“ META-INF/services/javax.script.ScriptEngineFactory
”服務注冊表文件中。
問題是盡管 OSGi 導入和導出包都很好,但服務注冊表似乎與 OSGi 不兼容(因為 OSGi 將其捆綁包遠離通用類路徑並為模塊使用單獨的類加載器)。
我的問題是,我認為 OSGi 與服務發現機制不兼容是否正確,如果不是,我可以添加什么到我的包元數據中,以便ScriptEngineManager.getEngineFactories()
將我的腳本引擎列出在 OSGi 環境中?
Apache Sling確實在 OSGi 環境中使用此機制來管理其 JSR-233 兼容的腳本引擎,主要是通過其 ScriptEngineManagerFactory class [1]。 另請參閱 [2] 以獲取示例自定義腳本引擎。
如果它與 JSR-233 兼容,則將腳本引擎添加到 Sling 應該可以工作。 最簡單的測試方法可能是按照“Sling in 15 minutes”教程 [3] 使用您的語言而不是那里使用的服務器端 javascript 語言。
[2] http://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/javascript
[3] http://sling.apache.org/site/discover-sling-in-15-minutes.html
Matt F. 寫了一篇關於替代解決方案的博客 [1]
在 Java 應用程序中提供腳本時,可以輕松嵌入符合 JSR 223 的腳本引擎(例如 Groovy、JRuby、Scala,...)
ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine scriptEngine = scriptEngineManager.getByName("groovy");
但是,在基於 OSGi 的應用程序中,ScriptEngineManager 無法發現位於已安裝包中的腳本引擎,因為它發現 class 路徑上可用的引擎的方式。 幸運的是,Apache Felix 項目已經解決了這個問題,有
- OSGiScriptEngineManager [2]
- OSGiScriptEngineFactory [3]
- OSGiScriptEngine [4]
它提供了一種符合 OSGi 的方法來發現和加載作為 OSGi 包安裝的腳本引擎。
ScriptEngineManager scriptEngineManager = new OSGiScriptEngineManager(bundleContext); ScriptEngine scriptEngine = scriptEngineManager.getByName("groovy");
現在我們已經擁有多年的腳本編寫和 OSGi 經驗,一個挑戰是簡化對 OSGi 服務的腳本訪問。 使用 ServiceTracker api [5] 似乎是唯一的方法; 但是對於簡單的腳本來說,這種努力是很高的。 我們一直致力於讓腳本表達他們想要的 OSGi 服務並代表腳本自動調用 ServiceTracker,但它很脆弱。 期待 OSGi 規范在未來提供更好的支持。
[1] http://devnotesblog.wordpress.com/2011/09/07/scripting-using-jsr-223-in-an-osgi-environment/
[5] https://osgi.org/javadoc/osgi.core/7.0.0/org/osgi/util/tracker/ServiceTracker.html
順便說一句,在 OSGi 環境中使用這些類型的服務有一個標准的通用解決方案,因為 ScriptEngineFactory 不是唯一的這種情況。 它是 OSGi Enterprise 規范的一部分。 參考實現可以在這里找到: http://aries.apache.org/modules/spi-fly.html
通過這種機制重新創建 Apache Spring 類的功能是微不足道的,而且 imo 這種方法更清潔、更明智,但我確實理解避免重新實現輪子的願望。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.