首頁  >  文章  >  更新到 2.x 後,在 OSGi 套件中使用“slf4j.api”需要擴充功能“osgi.serviceloader.processor”

更新到 2.x 後,在 OSGi 套件中使用“slf4j.api”需要擴充功能“osgi.serviceloader.processor”

王林
王林轉載
2024-02-10 21:12:081041瀏覽

php小編蘋果在介紹最新的更新到2.x版本後,發現在OSGi套件中使用"slf4j.api"需要擴充功能"osgi.serviceloader.processor"。這個更新對於使用這個擴充功能的開發者來說是一個重要的變化,因為它提供了更多的靈活性和便利性。這個更新的目的是為了幫助開發者更好地使用和管理slf4j.api,以提高程式的效能和穩定性。開發者可以期待更多的更新和改進,以滿足他們不斷發展的需求。

問題內容

我在 github 上建立了一個小型重現器專案:slf4j-experiment

基本上我需要的是一個 osgi 包,其中一些程式碼使用 slf4j-api

範例:

import org.osgi.service.component.annotations.activate;
import org.osgi.service.component.annotations.component;
import org.osgi.service.component.annotations.deactivate;
import org.slf4j.logger;
import org.slf4j.loggerfactory;

@component(service = someservice.class)
public class someserviceimpl implements someservice {
    private static final logger log = loggerfactory.getlogger(someserviceimpl.class);

    @override
    public string doit(string first, string second) {
        log.info("someserviceimpl: doit(..)");
        return operation(first, second);
    }

    static string operation(string first, string second) {
        return first + second;
    }

    @activate
    public void activate() {
        log.info("someserviceimpl: activate");
    }

    @deactivate
    public void deactivate() {
        log.info("someserviceimpl: deactivate");
    }
}

在我的 build.gradle 中我有:

dependencies {
    compileonly 'org.osgi:osgi.annotation:7.0.0'
    compileonly 'org.osgi:org.osgi.service.component.annotations:1.3.0'

    implementation 'org.slf4j:slf4j-api:2.0.11'
    runtimeonly 'org.slf4j:slf4j-simple:2.0.11'
    
    // ...
}

這與 slf4j 1.7.36 一起按預期工作

現在使用 slf4j 的 2.0.11 版本,由於服務提供者的使用,在 osgi 元資料中建模了新的約束,現在我陷入了困境:

Resolution failed. Capabilities satisfying the following requirements could not be found:
    [<<INITIAL>>]
      ⇒ osgi.identity: (osgi.identity=slf4j.simple)
          ⇒ [slf4j.simple version=2.0.11]
              ⇒ osgi.wiring.package: (&(osgi.wiring.package=org.slf4j)(version>=2.0.0)(!(version>=3.0.0)))
                  ⇒ [slf4j.api version=2.0.11]
                      ⇒ osgi.extender: (&(osgi.extender=osgi.serviceloader.processor)(version>=1.0.0)(!(version>=2.0.0)))

看來我需要一個額外的捆綁包,可能是由spi fly 提供的,但我不明白如何...

解決方法

您的範例 宣告:

slf4j.api;version='[1.7.36,1.7.37)',\
slf4j.simple;version='[1.7.36,1.7.37)'

(我不是 gradle osgi bnd 的粉絲)解析為 來自 maven 中心的 slf4j-api-1.7.36.jar

這是正確的 osgi 捆綁包:

import-package: org.slf4j.impl;version=1.6.0
export-package: org.slf4j;version=1.7.36, org.slf4j.spi;version=1.7.36
 , org.slf4j.helpers;version=1.7.36, org.slf4j.event;version=1.7.36

但是 slf4j-api-2.0.11.jar具有:

require-capability: osgi.extender;filter:="(&(osgi.extender=osgi.service
 loader.processor)(version>=1.0.0)(!(version>=2.0.0)))"

事實上 - 它滿足 aries spi-fly

Provide-Capability: osgi.extender;osgi.extender="osgi.serviceloader.re
 gistrar";version:Version="1.0",osgi.extender;osgi.extender="osgi.serv
 iceloader.processor";version:Version="1.0";uses:="org.apache.aries.sp
 ifly"

slf4j 在此提交中取得了這些標頭(要求)。 p>

spi-fly 是 osgi 對 java 服務載入器,動態轉換捆綁包的程式碼,以便設定正確的執行緒上下文類別載入器。

這實際上是slf4j api 2 的一個適當的要求,因為它們從記錄器實現的靜態綁定切換到/meta-inf/services/ org 的服務發現.slf4j.spi.slf4jserviceprovider服務。

然而,osgi 是一頭頑強的野獸。對於日誌記錄,我推薦 pax logging 項目,它不僅導出正確的 org.slf4j 包,而且還允許您動態配置日誌記錄後端並使用 osgi 配置管理對其進行配置。

以上是更新到 2.x 後,在 OSGi 套件中使用“slf4j.api”需要擴充功能“osgi.serviceloader.processor”的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除