【发布时间】:2019-10-31 04:15:09
【问题描述】:
我正在重构具有大量依赖项的 Java Web 应用程序。我想使用slf4j,log4j2 作为底层的日志实现。但是,该应用程序包含一些 Spring 依赖项。 Spring 使用 JCL(Jakarta 通用日志记录)进行日志记录,因此它引入了 commons-logging 作为传递依赖项。这是一个潜在的问题,因为这意味着 slf4j 可能会采用 jcl 作为日志记录实现,并且 Spring 可能会以不合需要的方式在某处进行日志记录。
从slf4j documentation开始,解决方法是先将commons-logging从POM中排除,然后用jcl-over-slf4j替换commons-logging。当然,jcl-over-slf4j 会将 Spring 之前的所有日志记录调用路由到 slf4j。
我已尝试排除commons-logging,例如
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
但是,在检查 Maven 依赖树时,commons-logging 现在仍然显示为 json-lib 的依赖,这是项目的另一个依赖。
很快就清楚,手动排除所有不需要的日志记录依赖项不会很好地扩展。 slf4j 文档继续建议使用作为选项提供的范围:
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<scope>provided</scope>
</dependency>
然而,正如this SO question 所讨论的,这种方法仍然意味着其他日志框架将在测试期间出现。此外,我不清楚这个提供的选项是否适用于commons-logging 的所有 版本,或者每个版本都需要一个特定的条目。如果是后者,那么这将与手动将commons-logging 排除在任何地方一样乏味。
排除不需要的日志记录依赖项以在 Java 应用程序中配置 slf4j 的最佳做法是什么?
【问题讨论】:
-
“很快就清楚,手动排除所有不需要的日志记录依赖项不会很好地扩展。” - 这真的有问题吗?难道你不能使用依赖树来找到添加排除项并使用一些脚本来添加这些吗?
-
@SpaceTrucker 这是一个非常麻烦的问题...在排除每次出现后依赖关系树都会发生变化,因此您想到的脚本可能相当重要。
-
与您的问题有关,但比解决您的依赖问题更值得深思:stackoverflow.com/a/41500347/3284624
-
关于您的依赖问题,maven 用户指南建议使用banned dependencies rule 和“当构建失败时,您需要在执行器找到的每个路径上添加特定的排除项。”我希望这意味着它会告诉您包括不需要的依赖项在内的所有内容,以便您可以一次添加所有排除项。