3

我有一个具有以下结构的多模块 Maven 项目(遵循标准约定):

  • 模块“核心”包含可重用代码
  • 模块“a”、“b”和“c”除了它们自己的东西外,都有“核心”作为它们的依赖项。有许多模块,如“a”、“b”和“c”(超过 20 个)。

模块“a”、“b”和“c”的 test/resources 中有一个 log4j.xml 文件,但这些模块的 main/resources 中没有 log4j.xml。原因是我希望每个模块都有不同的日志记录配置。

但是,由于最近要求主应用程序将日志发送到电子邮件的要求发生变化,我已将带有 SMTPAppender 的 log4j.xml 添加到“核心”的 main/resources。我曾希望这将使 log4j.xml 在所有三个模块的类路径中可用,并且电子邮件可以正常工作。此外,我曾希望各个模块“a”、“b”和“c”中的 test/resources/log4j.xml 会覆盖“core”并像以前一样运行。

然而这并没有发生。即使在测试期间,“core”中的 main/resources/log4j.xml 在类路径中也可用,导致测试尝试发送我不想要的电子邮件。

因此,我想要一个解决方案,以确保在“a”、“b”和“c”中运行测试时不会使用“core”中的 main/resources/log4j.xml。

我搜索了其他类似的帖子,发现:如何在测试期间覆盖 log4j.properties?这是相似但不同的。它讨论了在“相同”项目中覆盖 log4j.xml,但我的情况不同,因为这是关于覆盖依赖项中可用的 log4j.xml。另外,由于两个原因,我不想将 test/resources/log4j.xml 重命名为其他名称并配置surefire插件以使用它:

  • 我有很多模块,如“a”、“b”和“c”,我必须这样做,但我不想要
  • 这会让其他开发人员乍一看代码看起来很神奇,直到他们发现(或者我在文档中交流)pom.xml 中有一个隐藏的技巧。

这有更简单的解决方案吗?感谢所有帮助。

4

2 回答 2

0

如果您切换到 log4j2 或 logback,您将轻松解决此问题。这两个首先查找 log4j2-test.xml / logback-test.xml。所以测试配置会覆盖主配置。

于 2013-11-06T08:29:40.753 回答
-1

在每个应用程序“a”、“b”、“c”中,您可以将“log4j.xml”从“main/resources”移动到更深的包,例如,对于应用程序“a”:“main/resources/com/mycompany/一个”。可以通过以下几种方式在具体应用程序中指定所需“log4j.xml”的路径:

1)具有系统属性,例如。

export TOMCAT_OPTS="-Dlog4j.debug -Dlog4j.configuration=foo.xml"

2) 在应用程序启动期间使用 PropertyConfigurator:

PropertyConfigurator.configure(AApplication.class.getClassLoader().getResource("com/mycompany/a/log4j.properties"));

3) 在 Web 应用程序中,具体的“log4j.xml”可以在“web.xml”中指定。

于 2013-11-06T08:38:00.547 回答