簡體   English   中英

OSGi 從根本上與 JSR-223 腳本語言發現不兼容嗎?

[英]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 語言。

[1] http://svn.apache.org/repos/asf/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ScriptEngineManagerFactory.java

[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/

[2] http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngineManager.Z93F725A07448B33D21F425A07448B33D21F425A07448B33D21C

[3] http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngineFactory.Z93F725A07448B33D21F425A07448B33D21F425A07448B33D21C

[4] http://svn.apache.org/repos/asf/felix/trunk/mishell/src/main/java/org/apache/felix/mishell/OSGiScriptEngine.Z93F74268F448B3D21F8

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM