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.
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...
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 Namun, osgi adalah binatang yang tabah. Untuk pengelogan, saya mengesyorkan projek pengelogan pax, yang bukan sahaja mengeksport pakej /meta-inf/services/org 的服务发现.slf4j.spi.slf4jserviceprovider
perkhidmatan. 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!