In 2023-12 our project is switching our SLF4J
dependencies,
from: org.slf4j.api/org.slf4j.binding.simple 1.7.30 from 2023-06
Orbit repo
to: slf4j.api/slf4j.simple 2.0.9 from 2023-12 Orbit aggregation
repo
After the switch, the slf4j.simple binding no longer seems to be
found by the LoggerFactory.
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.
Debugging, it seems that the logger factory is trying to find
the bindings with ServiceLoader.load(SLF4JServiceProvider.class,
classLoaderOfLoggerFactory), where the class loader is an
EquinoxClassLoader[slf4j.api].
This should find SimpleServiceProvider from slf4j.simple bundle,
but it does not. With test code I can also see that the
slf4j.api Equinox class loader is not able to find the
SimpleServiceProvider class.
What I noticed is that, in SLF4J 1.7.30, the
org.slf4j.binding.simple is actually a fragment plugin with
org.slf4j.api as the fragment-host. But in SLF4J 2.0.9,
slf4j.simple is no longer a fragment of slf4j.api. This might
explain why its class loader can no longer find the service from
another plugin?
It so happens that in our project we have a fragment plugin of
org.slf4j.api whose only purpose is to provide the
simplelogger.properties resource, as this file must also be
found by the org.slf4j.api class loader at initialization. So I
tried adding the slf4j.simple as a dependency of our fragment
plugin. This makes it now possible for the slf4j.api class
loader to load the SimpleServiceProvider class in my test code.
But the LoggerFactory still isn't able to find it using the
ServiceLoader. Maybe ServiceLoader doesn't work with plugin
fragments?
Does anyone have any idea how this is supposed to work? I don't
know what I'm doing wrong. But then again, I know nothing, Jon
Snow.
I read this:
https://www.slf4j.org/faq.html#changesInVersion200,
it just says both plugins must be in the classpath. I do see
them in the Classpath of my test plugin (through Plug-In
Dependencies), but slf4j.simple is presumably not in the
classpath of the default slf4j.api plugin? And there are no Java
Build Path properties for fragment plugins.
Thanks for any help,
Patrick