>Java >2.x로 업데이트한 후 OSGi 번들에서 'slf4j.api'를 사용하려면 'osgi.serviceloader.processor' 확장이 필요합니다.

2.x로 업데이트한 후 OSGi 번들에서 'slf4j.api'를 사용하려면 'osgi.serviceloader.processor' 확장이 필요합니다.

王林
王林앞으로
2024-02-10 21:12:081057검색

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으로 문의하시기 바랍니다. 삭제