冗余包含 slf4j 库

Redundant inclusion of slf4j libraries

我有一个 java webapp 项目,它使用了 3 个自制库。这是布局:

Top level project A
|
+- Self-made library B (no dependencies on C or D)
+- Self-made library C (depends on D)
+- Self-made library D (no dependencies on B or C)
|
+- Other libraries that I didn't make myself

我想在这 4 个 java 项目中使用 Slf4j 登录。在我的 IDE 中,有 4 个独立的 java 项目。只有A是动态web项目。通过将 jar slf4j-api 添加到每个 java 项目,我能够在相关的 类 中实例化记录器并且我的代码可以正常编译。

接下来,我将 slf4j-log4j 活页夹 jar 和 log4j jar(具有匹配的版本)连同 log4j.properties 文件添加到我的所有项目中。现在每个项目实际上都会使用 log4j 实现记录一些东西

我知道我的4个项目的slf4j和log4j版本都是一样的,而且我也知道顶层项目依赖另外3个,都会打包成一个大的war文件最后。因此,将所有必要的 jar 单独添加到每个项目感觉是多余的。但是,我无法删除它们,因为这样每个项目都无法单独编译。

我用的是maven,我想知道我应该在哪个pom中写哪些依赖,在哪个项目中我需要添加一个log4j.properties文件,以便每个项目单独给出no(编译) IDE 中的错误,但我也尽量减少了相同日志库的冗余包含。

我觉得B、C、D库只要加上slf4j-api就够了,我只需要在webapp项目中提供一个实现(log4j + log4j binder)即可。但是,然后我在 4 个项目中仍然有相同的 jar。

你是对的,你在 B、C 和 D 中唯一的 compile-time 日志记录依赖应该在 slf4j-api 上。 (想法是,如果将这些库提供给其他人,他们将可以免费使用 log4jlogback 或其他任何东西。)

你也是对的,它只是你的 webapp 项目,或者更一般地说,无论你实际想要在运行时执行日志记录的项目,都需要具体的 log4j 绑定。也只有那个项目需要 log4j.properties 文件(在类路径中,在运行时)。

由于子模块编码为 SLF4J api,因此无法避免它们对 slf4j-api 具有 compile-time 依赖性。如果您不想多次声明该依赖项,那么您可以让它们都从一个共同的父 pom 继承该依赖项。