Heim > Java > Hauptteil

Nach dem Update auf 2.x erfordert die Verwendung von „slf4j.api' in einem OSGi-Bundle die Erweiterung „osgi.serviceloader.processor'.

王林
Freigeben: 2024-02-10 21:12:08
nach vorne
1038 Leute haben es durchsucht

Nach der Einführung des neuesten Updates auf Version 2.x stellte der Herausgeber von PHP Apple fest, dass die Verwendung von „slf4j.api“ im OSGi-Paket die Erweiterung „osgi.serviceloader.processor“ erfordert. Dieses Update ist eine wichtige Änderung für Entwickler, die diese Erweiterung verwenden, da es mehr Flexibilität und Komfort bietet. Der Zweck dieses Updates besteht darin, Entwicklern dabei zu helfen, slf4j.api besser zu nutzen und zu verwalten, um die Programmleistung und -stabilität zu verbessern. Entwickler können sich auf weitere Updates und Verbesserungen freuen, um ihren sich ändernden Anforderungen gerecht zu werden.

Frageninhalt

Ich habe ein kleines Reproduktionsprojekt auf Github erstellt: slf4j-experiment

Grundsätzlich brauche ich ein Osgi-Paket mit etwas Code, der slf4j-api verwendet.

Beispiel:

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");
    }
}
Nach dem Login kopieren

In meinem build.gradle habe ich:

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'
    
    // ...
}
Nach dem Login kopieren

Das funktioniert wie erwartet mit slf4j 1.7.36

Wenn ich jetzt die 2.0.11-Version von slf4j verwende, gibt es aufgrund der Verwendung von Dienstanbietern neue Einschränkungen, die in den Osgi-Metadaten modelliert sind, und jetzt stecke ich fest:

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)))
Nach dem Login kopieren

Sieht so aus, als ob ich ein zusätzliches Paket benötige, das wahrscheinlich von spi fly bereitgestellt wird, aber ich verstehe nicht, wie ...

Problemumgehung

Ihr Beispiel Haftungsausschluss:

slf4j.api;version='[1.7.36,1.7.37)',\
slf4j.simple;version='[1.7.36,1.7.37)'
Nach dem Login kopieren

(Ich bin kein Fan von Gradle + Osgi + BND) wird von Maven Central zu slf4j-api-1.7.36.jar aufgelöst.

Dies ist das richtige Osgi-Bundle:

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
Nach dem Login kopieren

Aber slf4j-api-2.0.11.jar hat:

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

Tatsächlich – es befriedigt 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"
Nach dem Login kopieren

slf4j hat diese Header (erforderlich) in diesem Commit erhalten . p>

spi-fly ist OSGIs Version des Java Service Loader, die den Code des Bundles dynamisch umwandelt, um den richtigen Thread-Kontext-Klassenlader einzurichten.

Dies ist eigentlich eine richtige Anforderung für slf4j API 2, da sie von der statischen Bindungimplementiert durch Logger zu /meta-inf/services/org 的服务发现.slf4j.spi.slf4jserviceproviderDiensten wechseln.

Allerdings ist Osgi ein hartnäckiges Biest. Für die Protokollierung empfehle ich das Pax-Logging-Projekt, das nicht nur die richtigen org.slf4j Pakete exportiert, sondern auch die dynamische Konfiguration des Logging-Backends und die Konfiguration über das Osgi-Konfigurationsmanagement ermöglicht.

Das obige ist der detaillierte Inhalt vonNach dem Update auf 2.x erfordert die Verwendung von „slf4j.api' in einem OSGi-Bundle die Erweiterung „osgi.serviceloader.processor'.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!