slf4j如何将sfl4j-api中放置的org.slf4j.impl.StaticLoggerBinder替换为真正的StaticLoggerBinder

nah*_*hab 3 java classloader slf4j

slf4j api 中存在类 org.slf4j.impl.StaticLoggerBinder、org.slf4j.impl.StaticMarkerBinder、org.slf4j.impl.StaticMDCBinder。但是到具体记录器的每个绑定都应该包含相同的类。

例如:

http://grepcode.com/file/repo1.maven.org/maven2/org.slf4j/slf4j-api/1.6.1/org/slf4j/impl/StaticLoggerBinder.java?av=f

及其log4j实现: http://grepcode.com/file/repo1.maven.org/maven2/org.slf4j/slf4j-log4j12/1.6.1/org/slf4j/impl/StaticLoggerBinder.java ?av=f

java类加载器如何替代它?这里不应该是一个例外吗?

Dev*_*Dev 5

如果您提取实际的 slf4j-api jar,您会发现它org.slf4j.impl.StaticLoggerBinder实际上并未包含在 jar 中。SFL4J api 在构建时针对类进行编译,但实际上并未包含在工件中。如果您查看org.slf4j.impl.StaticLoggerBinderapi 模块中的源代码,它没有实现,所有公共实例方法都会抛出异常UnsupportedOperationException。这也没关系,因为该类已从 slf4j-api jar 中排除。

类加载器表现正常,并org.slf4j.impl.StaticLoggerBinder在需要加载类时选择找到的第一个版本。这通常来自类路径上列出的第一个 slf4j 实现 jar。

注意:findPossibleStaticLoggerBinderPathSet()仅用于警告类路径上存在多个绑定。它实际上并不加载任何绑定。