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中文網其他相關文章!