После того, как я отследил их все, создал новые пакеты из существующих 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
Теперь мой код не использует какую-либо логику сервисных инфраструктур 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");
}
}
Код: Выделить всё
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
Код: Выделить всё
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
Вот тест:
Код: Выделить всё
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