Rumah > Java > 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'

王林
Lepaskan: 2024-02-10 21:12:08
ke hadapan
1065 orang telah melayarinya

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");
    }
}
Salin selepas log masuk

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'
    
    // ...
}
Salin selepas log masuk

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)))
Salin selepas log masuk

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)'
Salin selepas log masuk

(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
Salin selepas log masuk

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)))"
Salin selepas log masuk

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"
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan