【问题标题】:Redundant inclusion of slf4j librariesslf4j 库的冗余包含
【发布时间】:2016-03-02 10:49:39
【问题描述】:

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

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 binder jar 和 log4j jar(具有匹配的版本)以及 log4j.properties 文件添加到我的所有项目中。现在每个项目实际上都会使用 log4j 实现来记录一些东西

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

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

我认为只添加slf4j-api对于库B,C和D就足够了,并且我只需要在webapp项目中提供一个实现(log4j + log4j binder)。但是,那我在 4 个项目中仍然有相同的 jar。

【问题讨论】:

  • 如果您只在库项目中包含 api 依赖项,您能否详细说明您看到的编译器错误?

标签: java maven logging slf4j


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多