2 回答
TA贡献1793条经验 获得超6个赞
为了详细说明我的评论,SLF4J是一个日志外观。这意味着它提供的只是一些接口和一些帮助类来平滑幕后的事情。要实际使用它,您需要选择一个日志记录实现。
有许多实现可供选择,但最值得注意的是:
当您选择一个实现时,您通常还需要从 SLF4J 到该实现的绑定以及从其他日志 API 到 SLF4J 的桥接。这些网桥的存在是使用 SLF4J 的最大原因,因为这样您就可以将所有应用程序及其依赖项的登录路由到一个实现中。甚至支持java.util.logging
转发到 SLF4J。
但关键是您不能同时在类路径上拥有相同实现的绑定和桥接。否则,您会看到这里的内容:堆栈溢出,因为桥正在调用 SLF4J,而 SLF4J 正在调用正在调用桥的绑定。不幸的是,生态系统和陷阱并不总是被广泛理解,有时人们在分发他们的软件时会做错事。例如,已发布的库不应该引入绑定或桥接。一个库应该只依赖于 SLF4J API。只有完成的应用程序或库的测试用例才应该选择一个实现,从而为其他日志记录 API 引入绑定(如果需要)和桥接。
这些是绑定:
slf4j-jcl使用 commons-logging 作为实现
slf4j-log4j12使用 Log4j 1.2.x 作为实现
log4j-slf4j-impl使用 Log4j 2.x 作为实现
logback-classic使用 Logback 作为实现
slf4j-simple是 SLF4J 的一个非常基本的实现
这些是桥梁:
jcl-over-slf4j将 commons-logging API 桥接到 SLF4J
log4j-over-slf4j将 Log4j 1.2.x API 桥接到 SLF4J
log4j-to-slf4j将 Log4j 2.x API 桥接到 SLF4J
jul-to-slf4j连接
java.util.logging
到 SLF4J
没有 logback 桥,因为 logback 的“原生”API 与 SLF4J 重叠。
使用 SLF4J 时,您希望选择其中一种实现。然后包括以下所有内容:
您选择的实现的绑定
除了您选择的实现的桥之外的所有桥
如果您的任何传递依赖项尝试将它们拉入,您希望排除以下所有内容:
您选择的实现的桥梁
除了您选择的实现的绑定之外的任何绑定
TA贡献1788条经验 获得超4个赞
问题是项目使用的一些库之间存在冲突。
显然,有人曾经使用过另一个我们不再使用的登录库 (slf4j)。我们从 pom.xml 中删除了该库,但它已经下载到我们的计算机中。这导致了产生 StackOverflowError 的冲突。
要解决它,只需删除不需要的登录库。
感谢 talex 指出正确的方向
添加回答
举报