Rumah  >  Artikel  >  Selepas mengemas kini kepada 2.x, menggunakan "slf4j.api" dalam berkas OSGi memerlukan sambungan "osgi.serviceloader.processor"

Selepas mengemas kini kepada 2.x, menggunakan "slf4j.api" dalam berkas OSGi memerlukan sambungan "osgi.serviceloader.processor"

王林
王林ke hadapan
2024-02-10 21:12:08971semak imbas

Selepas memperkenalkan kemas kini terkini kepada versi 2.x, editor PHP Apple mendapati bahawa menggunakan "slf4j.api" dalam pakej OSGi memerlukan sambungan "osgi.serviceloader.processor". Kemas kini ini merupakan perubahan penting untuk pembangun yang menggunakan sambungan ini, kerana ia memberikan lebih fleksibiliti dan kemudahan. Tujuan kemas kini ini adalah untuk membantu pembangun menggunakan dan mengurus slf4j.api dengan lebih baik untuk meningkatkan prestasi dan kestabilan program. Pembangun boleh mengharapkan lebih banyak kemas kini dan penambahbaikan untuk memenuhi keperluan mereka yang semakin berkembang.

Kandungan soalan

Saya mencipta projek penerbit semula kecil di github: slf4j-experiment

Pada asasnya apa yang saya perlukan ialah pakej osgi dengan beberapa kod menggunakan slf4j-api.

Contoh:

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");
    }
}

Dalam build.gradle saya saya ada:

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'
    
    // ...
}

Ini berfungsi seperti yang diharapkan dengan slf4j 1.7.36

Kini menggunakan versi 2.0.11 slf4j, disebabkan penggunaan penyedia perkhidmatan, terdapat kekangan baharu yang dimodelkan dalam metadata osgi dan kini saya terperangkap:

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)))

Nampaknya saya memerlukan bundle tambahan, mungkin disediakan oleh spi fly, tetapi saya tidak faham caranya...

Penyelesaian

Anda Contoh Penafian:

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

(Saya bukan peminat gradle + osgi + bnd) berazam untuk slf4j-api-1.7.36.jar dari maven central.

Ini ikatan osgi yang betul:

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

Tetapi slf4j-api-2.0.11.jar mempunyai:

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

Malah - ia memuaskan hati 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 mendapat pengepala ini (diperlukan) dalam komit ini . p>

spi-fly ialah pandangan osgi pada pemuat perkhidmatan java, menukar kod himpunan secara dinamik untuk menyediakan pemuat kelas konteks benang yang betul.

Ini sebenarnya adalah keperluan yang sesuai untuk slf4j API 2 kerana ia beralih daripada pengikatan statikdilaksanakan oleh pembalak kepada /meta-inf/services/org 的服务发现.slf4j.spi.slf4jserviceproviderperkhidmatan.

Namun, osgi adalah binatang yang tabah. Untuk pengelogan, saya mengesyorkan projek pengelogan pax, yang bukan sahaja mengeksport pakej org.slf4j yang betul, tetapi juga membolehkan anda mengkonfigurasi bahagian belakang pengelogan secara dinamik dan mengkonfigurasinya menggunakan pengurusan konfigurasi osgi.

Atas ialah kandungan terperinci Selepas mengemas kini kepada 2.x, menggunakan "slf4j.api" dalam berkas OSGi memerlukan sambungan "osgi.serviceloader.processor". Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Pengawal API musim bungaArtikel seterusnya:Pengawal API musim bunga