冗余包含slf4j库

时间:2015-11-28 11:35:24

标签: java maven logging slf4j

我有一个使用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文件中。因此,将所有必要的罐子单独添加到每个项目中会感到多余。但是,我无法删除它们,因为这样每个项目都不会编译。

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

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

1 个答案:

答案 0 :(得分:1)

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

您也是对的,它只是您的webapp项目,或者更常见的是您在运行时实际需要执行日志记录的项目,需要具体的log4j绑定。它也只是需要log4j.properties文件的项目(在类路径中,在运行时)。

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