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 的一个适当的要求,因为它们从记录器实现的静态绑定切换到 然而,osgi 是一头顽强的野兽。对于日志记录,我推荐 pax logging 项目,它不仅导出正确的 /meta-inf/services/org 的服务发现.slf4j.spi.slf4jserviceprovider
服务。org.slf4j
包,而且还允许您动态配置日志记录后端并使用 osgi 配置管理对其进行配置。
以上是更新到 2.x 后,在 OSGi 包中使用“slf4j.api”需要扩展程序“osgi.serviceloader.processor”的详细内容。更多信息请关注PHP中文网其他相关文章!