簡體   English   中英

OSGi 中僅運行時依賴項的最佳實踐

[英]Best practices for runtime-only dependencies in OSGi

根據開閉原則,我通常設計我的 Java 包和庫的方式是有一個通用的“接口”或“API”包/庫和一個或多個實現(非常類似於許多常見的 API,如 JDBC或 JAXP/SAX)。 為了在不違反 OCP 的情況下在基本 API 庫中找到一個實現(或有時是多個實現),我通常使用 Java 的ServiceLoader機制,或者偶爾通過ClassGraphReflections等第三方庫進行類路徑掃描。 從 Maven 的角度來看,實現是作為runtime依賴項引入的(因為它們僅在執行時需要,但在編譯時不需要)。 很標准的東西。

所以,現在,我想將這些包中的一些作為 OSGi 包提供(使用 API 並在單獨的包中實現),但由於在 OSGi 中,每個包都有自己的 class 加載器,類路徑掃描和ServiceLoader ZDB97423781014CA8ACE4FZA 都不能用於此目的. 乍一看,OSGi 的“片段”機制似乎與上述純 Java 設置最接近。 在這種情況下,API 包將是“片段主機”,具體實現將作為片段附加到該主機包。 由於片段主機及其所有附加片段使用相同的 class 加載器,因此可以想象像ServiceLoader或 ClassGraph 這樣的標准純 Java 機制仍然可以工作。 這還有一個優點,那就是不需要檢測庫/包是否在 OSGi 上下文中運行,並且不需要 OSGi 框架依賴項。

所以,簡而言之,我的問題是:片段是在 OSGi 中實現僅運行時依賴項的正確方法,還是有更好(或更標准)的方法? 最好,我正在尋找一種在 OSGi 容器中工作但不需要依賴於 OSGi 本身的解決方案。

沒有片段在翻譯之外幾乎總是錯誤的。 OSGi model 是使用服務

go 的方法是使用 DS。 使用 bnd(在 maven、gradle、ant、sbt 中,您可以創建組件。) 組件是一個普通的舊 Java Object (POJO),帶有注入和激活說明。 您可以使這些組件在構造函數中獲取其所有依賴項。

bnd 代碼使用注釋生成 XML 文件,該文件在運行時用於創建、激活、注入和注冊這些組件。 這將在 OSGi 框架中開箱即用。 注釋是構建時間,因此它們不會在您的運行時創建依賴項。

在您的非 OSGi 環境中,您將負責自己調用該構造函數。 因此,您使用 Service Loader 收集依賴項,然后以正確的順序構建它們。

@Component
public class MyComponent implements Foo {

      final Bar bar;

      @Activate
      public MyComponent( @Reference Bar bar ) {
        this.bar = bar;
      }
      ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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