Поставщики SLF4J с OSGI не найденыJAVA

Программисты JAVA общаются здесь
Anonymous
Поставщики SLF4J с OSGI не найдены

Сообщение Anonymous »

Я конвертировал существующее приложение в набор модулей OSGI вместе с их бесчисленными зависимостями.
После того, как я отследил их все, создал новые пакеты из существующих jar-файлов с помощью bnd, я наконец-то загрузил все в Felix. Все пакеты активируются.
Затем я создал простой активатор, который вызывал мой статический метод MainClass.main, чтобы проверить, запустится ли он.
Удивительно, но, похоже, это работает.
Но я получаю это, когда мой активатор запускается.

Код: Выделить всё

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
После того, как он это напечатает, позже я получаю следующее:

Код: Выделить всё

INFO: Registered provider org.slf4j.simple.SimpleServiceProvider of service org.slf4j.spi.SLF4JServiceProvider in bundle slf4j.simple
Это означает, что SLF4J запускается, и я знаю, что мне пришлось пройти через некоторые препятствия при установке OSGI для поддержки SLF4J (поддержка поставщика услуг Aries). Но это начинается после вызова моего активатора, и SLF4J, похоже, не «знает», что Simple установлен.
Теперь мой код не использует какую-либо логику сервисных инфраструктур OSGI. На данном этапе я просто использую OSGI в качестве сложного загрузчика классов. Мой код просто использует SLF4J, как обычное приложение, а не систему OSGI Logger.
Я попробовал добавить ServiceTracker, чтобы не запускать свой, пока SLF4J не появится как служба, но получил тот же результат. Вероятно, это связано с тем, что одно дело — дождаться формального сервиса OSGI, но это сильно отличается от настройки всех внутренних путей к классам. Это происходит сразу, и провайдера SLF4J он явно не находит. Я даже изменил один из модулей, чтобы он требовал поставщика SLF4J в качестве пакета импорта, но это не повлияло.
Редактировать:
Вот пример Java-модуля, включая активатор и службу

Код: Выделить всё

willh@iMac-2 LogTestOsgi % cat src/main/java/pkg/logtestosgi/Activator.java
package pkg.logtestosgi;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Activator implements BundleActivator {

Logger l = LoggerFactory.getLogger(this.getClass());

public void start(BundleContext context) throws Exception {
context.registerService(MyService.class.getName(), new MyServiceImpl(), null);
System.out.println("Activating myservice");
l.info("activating log info");
}

public void stop(BundleContext context) throws Exception {
System.out.println("deactivating myservice");
l.info("deactivating log info");
}

}
Интерфейс сервиса:

Код: Выделить всё

willh@iMac-2 LogTestOsgi % cat src/main/java/pkg/logtestosgi/MyService.java
package pkg.logtestosgi;

public interface MyService {
public void go();
}
И сервис:

Код: Выделить всё

willh@iMac-2 LogTestOsgi % cat src/main/java/pkg/logtestosgi/MyServiceImpl.java
package pkg.logtestosgi;

public class MyServiceImpl implements MyService {

public void go() {
System.out.println("My Service says hello");
}

}
Это POM-файл. Обратите внимание, что все необходимые модули копируются в каталог target/lib.

Код: Выделить всё

willh@iMac-2 LogTestOsgi % cat pom.xml
x s i : s c h e m a L o c a t i o n = & q u o t ; h t t p : / / m a v e n . a p a c h e . o r g / P O M / 4 . 0 . 0   h t t p : / / m a v e n . a p a c h e . o r g / x s d/maven-4.0.0.xsd">
4.0.0

pkg
LogTestOsgi
1.2.3
bundle

LogTestOsgi OSGi Bundle


UTF-8




org.osgi
org.osgi.core
4.3.0
provided


org.slf4j
slf4j-api
2.0.7
jar


org.slf4j
slf4j-simple
2.0.7
jar


org.apache.aries.spifly
org.apache.aries.spifly.dynamic.bundle
1.3.6
jar


org.apache.aries
org.apache.aries.util
1.1.3
jar


org.ow2.asm
asm
9.5


org.ow2.asm
asm-analysis
9.5


org.ow2.asm
asm-commons
9.5


org.ow2.asm
asm-tree
9.5


org.ow2.asm
asm-util
9.5






org.apache.felix
maven-bundle-plugin
2.3.7
true


pkg.logtestosgi.Activator





maven-dependency-plugin


package

copy-dependencies


${project.build.directory}/lib
org.osgi







В корне проекта есть простой скрипт оболочки, позволяющий переместить все на свои места. Предполагается, что установочный архив Felix находится в моем каталоге «Загрузки».

Код: Выделить всё

willh@iMac-2 LogTestOsgi % cat go.sh
set -x
rm -rf felix-framework-7.0.5
unzip ~/Downloads/org.apache.felix.main.distribution-7.0.5.zip
cp target/lib/* felix-framework-7.0.5/bundle
cp target/LogTestOsgi-1.2.3.jar felix-framework-7.0.5/bundle
Он копирует все модули в каталог пакета Felix, чтобы они автоматически устанавливались и запускались при запуске Felix.
Вот тест:

Код: Выделить всё

willh@iMac-2 LogTestOsgi % cd felix-framework-7.0.5
willh@iMac-2 felix-framework-7.0.5 % java -jar bin/felix.jar
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
Activating myservice
Jan 31, 2024 11:41:39 AM org.apache.aries.spifly.BaseActivator log
INFO: Registered provider org.slf4j.simple.SimpleServiceProvider of service org.slf4j.spi.SLF4JServiceProvider in bundle slf4j.simple
____________________________
Welcome to Apache Felix Gogo

g! lb
START LEVEL 1
ID|State      |Level|Name
0|Active     |    0|System Bundle (7.0.5)|7.0.5
1|Active     |    1|LogTestOsgi OSGi Bundle (1.2.3)|1.2.3
2|Active     |    1|org.objectweb.asm (9.5.0)|9.5.0
3|Active     |    1|org.objectweb.asm.tree.analysis (9.5.0)|9.5.0
4|Active     |    1|org.objectweb.asm.commons (9.5.0)|9.5.0
5|Active     |    1|org.objectweb.asm.tree (9.5.0)|9.5.0
6|Active     |    1|org.objectweb.asm.util (9.5.0)|9.5.0
7|Active     |    1|jansi (1.18.0)|1.18.0
8|Active     |    1|JLine Bundle (3.13.2)|3.13.2
9|Active     |    1|Apache Aries SPI Fly Dynamic Weaving Bundle (1.3.6)|1.3.6
10|Active     |    1|Apache Aries Util (1.1.3)|1.1.3
11|Active     |    1|Apache Felix Bundle Repository (2.0.10)|2.0.10
12|Active     |    1|Apache Felix Gogo Command (1.1.2)|1.1.2
13|Active     |    1|Apache Felix Gogo JLine Shell (1.1.8)|1.1.8
14|Active     |    1|Apache Felix Gogo Runtime (1.1.4)|1.1.4
15|Active     |    1|slf4j-api (2.0.7)|2.0.7
16|Active     |    1|slf4j-simple (2.0.7)|2.0.7
Все пакеты активны, предупреждений о зависимостях нет.
Активатор пытается использовать регистратор SLFJ, но при этом срабатывает
No SLF4J providers were found. предупреждение. Но SLF4J и SLF4J simple включены в коллекцию пакетов.
Речь идет не о том, как использовать SLF4J как часть службы ведения журнала OSGI, речь идет о получении устаревшего модуля, который использует SLF4J внутри, чтобы правильно обнаружить поставщика (в данном случае SLF4J-simple).
SLF4J, насколько я понимаю, опирается на платформу Java ServiceLoader, поэтому Включены модули Aries и ASM (поскольку, насколько я понимаю, они обеспечивают необходимую связь для работы OSGI в мире ServiceLoader).
Но явно чего-то не хватает.

Подробнее: https://stackoverflow.com/questions/779 ... -with-osgi

Вернуться в «JAVA»