我认为SLF4J会通过反射加载 org.slf4j.impl.StaticLoggerBinder ,但查看 org.slf4j.LoggerFactory 中的代码,情况并非如此:< / p>
StaticLoggerBinder.getSingleton().getLoggerFactory();
这可能表明当他们打包slf4j-api.jar时,他们在类路径中有 slf4j-simple.jar (或 slf4j-nop.jar ) ,然而这将导致循环依赖,因为上面的方法返回的 ILoggerFactory 接口在 slf4j-api.jar 中定义。
所以,我认为当他们打包 slf4j-api.jar 时,他们有一个 StaicLoggerBinder (和其他类似的类)的存根实现,他们会编译但是然后删除来自jar的.class文件。听起来有点不合适,不是吗?
使用什么样的构建工具来实现这样的结果?具体来说,如果我使用Maven,我如何构建这样的jar,其中编译时生成的类被排除在工件之外?可能还会生成匿名和其他内部/嵌套类,如果它们也被删除了吗?
答案 0 :(得分:2)
“所以,我认为当他们打包slf4j-api.jar时,他们有一个StaicLoggerBinder(以及其他类似的类)的存根实现,他们会编译但是然后从jar中删除.class文件。听起来有点不公平,不是吗?“
这是怎么回事。我不会说那是不合适的 - 能够以一种相当简单的方式支持多种实现是一种必要的“邪恶”。 SLF4J StaticLoggerBinder
答案 1 :(得分:1)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<configuration>
<tasks>
<echo>Removing slf4j-api's dummy StaticLoggerBinder and StaticMarkerBinder</echo>
<delete dir="target/classes/org/slf4j/impl"/>
</tasks>
</configuration>
</plugin>
所以,我认为当他们打包slf4j-api.jar时,他们有一个StaicLoggerBinder(和其他类似的类)的存根实现,他们会编译,但然后从jar中删除.class文件。
这是正确的,有必要实施static binding。