当前位置: 首页 > 知识库问答 >
问题:

在具有许多传递依赖关系的应用程序中实现SLF4J

楮庆
2023-03-14

我正在重构一个具有相当多依赖项的JavaWeb应用程序。我想使用slf4j,将log4j2作为底层日志实现。但是,该应用程序包含一些Spring依赖项。Spring使用JCL(Jakarta common logging)进行日志记录,因此它引入了commons日志记录,作为一个可传递的依赖项。这是一个潜在的问题,因为这意味着slf4j可能会使用jcl作为日志实现,而Spring可能会以不希望的方式在某个地方进行日志记录。

根据slf4j文档,解决方案是首先通过将其从POM中排除来关闭commons日志记录,然后使用jcl-over-slf4j替换commons日志记录。当然,jcl-over-slf4j将把Spring以前发出的所有日志调用路由到slf4j

我已经尝试排除共享日志,例如。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

但是,在检查Maven依赖树时,公共日志现在仍然显示为json-lib的依赖项,这是项目的另一个依赖项。

很快就清楚了,手动排除所有不需要的日志依赖项不会很好地扩展。slf4j文档继续建议使用作为选项提供的范围:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <scope>provided</scope>
</dependency>

然而,正如这个SO问题所讨论的,这种方法仍然意味着其他日志框架将在测试期间出现。此外,我不清楚提供的选项是否适用于所有版本的commons logging,或者每个版本是否需要特定的条目。如果是后一种情况,那么这就像手动排除commons日志一样单调乏味。

在Java应用程序中配置slf4j时,排除不需要的日志依赖项的最佳做法是什么?


共有1个答案

张勇
2023-03-14

Commons日志不是slf4j实现。只需将其保留在类路径上,并包括log4jjcl,以将所有公共日志调用路由到Log4J。

 类似资料:
  • 我正在从一个使用Android-Maven-Plugin的Maven项目中构建一个Android应用程序。在这个项目中,我使用了新的beta版数据绑定库。 它包含在Android SDK的本地m2repository中(extras/Android/m2repository)。这个存储库中的库打包为AAR类型。 附注:对于我自己的本地构建,我有几个解决方案(例如重新打包为jar),但我更喜欢一个更

  • 我正在尝试构建一个简单的REST服务来学习OSGI。我正在使用Spark Servlet来处理请求。 我将 spark core 作为依赖项嵌入,在 maven 中构建了我的项目,并在部署时在 Karaf 中出现了布线包错误。 看起来我一个接一个地跟踪程序包,一个一个地解决每个错误,仅仅解决依赖关系就需要大约2个小时。显然我做错了什么。。 我应该如何执行此操作,以便使用 spark servlet

  • 我有一个Gradle构建脚本,包含以下依赖项(其他不多):

  • 问题内容: 我在ivaven.xml中添加了一个依赖项(让我们将其命名为A),它在maven Central中具有一个pom文件。Ivy使用ibiblio解决了Maven依赖关系。添加到ivy.xml的依赖项(A)具有传递的依赖项(B)。到目前为止,到目前为止很好。常春藤无法解决传递性依赖项(B)的依赖项(C)。 我在ivy.xml中定义了A,如下所示: 在B的pom文件中,在编译和测试范围中都定

  • 我有一个名为Helper的Laravel Facade,它向外部存储库注入了构造函数依赖项。但是我无法通过facades服务提供商传递它的依赖项。 这是Helper.php的代码 以下是我在FacadesServiceProviders的工作。php文件 但是现在我得到了这个错误 Symfony\Component\Debug\Exception\FatalThrowableError(E\u R

  • 我是和的新手。我正在尝试在远程计算机上运行hdfs MapReduce作业。我没有写入/编辑依赖项文件的权限。我想知道是否可以将我的Maven项目传递给我的MapReduce作业。这样,我就不需要SSH进入远程机器并更改maven项目的依赖关系。我将使用包含远程计算机上未包含的所有所需依赖项的JAR来运行我的MapReduce作业。