2

想知道我应该包含的依赖关系,以将 commons-logging 连接到 slf4j-api。

通过添加以下内容,我的构建成功:

"org.apache.logging.log4j:log4j-api:2.12.1"
"org.apache.logging.log4j:log4j-core:2.12.1"
"org.apache.logging.log4j:log4j-1.2-api:2.12.1"
"org.slf4j:slf4j-api:${slf4j_version}"
"org.apache.logging.log4j:log4j-slf4j-impl:2.12.1"
"org.slf4j:slf4j-jcl:1.7.25"

但无法启动我的服务:( 获取 java.lang.ExceptionInInitializerError ... 原因:org.springframework.beans.factory.CannotLoadBeanClassException

4

1 回答 1

6

您需要在此处执行几个步骤。首先,您应该包含该jcl-over-slf4j.jar文件,例如:

<!-- https://mvnrepository.com/artifact/org.slf4j/jcl-over-slf4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.28</version>
</dependency>

这个 JAR,如果在运行时包含,应该接收来自任何使用 Jakarta 公共日志记录的所有日志记录调用,然后将其重新路由到您的 SLF4J 外观(您可以使用您想要的任何实现从该外观进行日志记录)。

但是,理想情况下,您还应该采取额外的步骤。您应该在 Maven POM 中更改commons-loggingto的依赖范围:provided

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>[1.0,)</version> <!-- include all possible versions -->
    <scope>provided</scope>   <!-- IMPORTANT -->
</dependency>

通过commons-logging提供,您告诉 Maven 在构建时将它包含在代码中需要它的任何组件(例如 Spring 之类的东西)中,但在运行时将其排除在最终 JAR 输出中。相反,jcl-over-slf4j.jar上面提到的桥接 JAR 将在运行时存在。例如,Spring 仍然会在运行时调用 Jakarta 日志记录,但这实际上只是被输入到 SLF4J 外观中,最终得到您提供的任何日志记录实现。

查看slf4j 文档,其中讨论了上面提到的一些事情。

旁注:您可能希望mvn dependency:tree在您的项目上运行以验证您的 Maven 库配置是否正确。除了您选择与 SLF4J 一起使用的实现之外,您不应该看到任何其他日志记录实现。特别是,commons-logging应该只显示为provided,即它不应该在您的 JAR 的类路径中。

于 2019-09-11T04:59:51.703 回答