logback-test.xml和多模块Maven项目

7

在我的Maven项目中,我有一个模块依赖于另一个模块以及它的测试代码/资源:

...
<scope>test</scope>
<type>test-jar</type>
...

现在,这两个模块都有自己的logback-test.xml,每个模块都有特定的配置来运行该模块中的测试。然而,正如预期的那样,在子模块中运行测试时,logback会发出警告,说明路径中有多个logback-test.xml文件,并且使用其默认的日志记录配置:

08:44:17,528 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
08:44:17,530 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:path/to/my/project/module2/logback-test.xml]
08:44:17,532 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback-test.xml] occurs multiple times on the classpath.
08:44:17,533 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback-test.xml] occurs at [file:/C:/path/to/my/project/module2/logback-test.xml]
08:44:17,533 |-WARN in ch.qos.logback.classic.LoggerContext[default] - Resource [logback-test.xml] occurs at [file:/C:/path/to/my/project/module1/logback-test.xml]
08:44:17,636 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
08:44:17,647 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
08:44:17,653 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
08:44:17,692 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
08:44:17,764 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to WARN
08:44:17,764 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
08:44:17,765 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.myproject] to TRACE
08:44:17,765 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [ch.qos.logback] to OFF
08:44:17,768 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@5b0a485c - Registering current configuration as safe fallback point

我想知道我该如何解决这个问题。 我想为每个模块保留多个配置; 我猜我不能从类路径中排除一个文件; 我只是希望logback关闭我已经知道的事情。 从最后两行可以看出,我已经在配置中将整个logback包设置为“OFF”,但它仍然继续记录。 日志模式也与我在任何配置中配置的不同。
Logback通过SLF4J在代码中进行配置和使用。
当在父模块中运行测试时,没有记录任何内容(既不是INFO也不是WARN消息),因此我不能归咎于任何奇怪的Logback行为。
1个回答

8
您可以从测试 jar 中排除 logback-test.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <configuration>
                <excludes>
                    <excludes>logback-test.xml</excludes>
                </excludes>
            </configuration>
        </execution>
    </executions>               
</plugin>

或者(我没有尝试过)你可以使用命名约定,例如logback-test-project.a.xmllogback-test-project.b.xml等,并在每个项目中以不同的方式配置surefire,使用-Dlogback.configurationFile=logback-test-project.a.xml

3
排除解决方案只在一种情况下解决问题:当在一个模块上运行测试时,所有其他依赖项都是来自存储库的JAR文件。然而,在Eclipse中运行一个单元测试(我猜这是Maven与事物关系很少的点),或者在父POM上运行“clean test”,不受此配置的影响。不幸的是,前两种方式是我运行测试用例最频繁的方法。 - uiron
你的父POM是否有自己的logback-test,还是纯粹是一个聚合器? - artbristol
不,父级中没有代码。我曾考虑过只在父级中设置日志记录,但我真的希望每个模块都有不同的日志记录设置。 - uiron
这让我感到非常疯狂。现在我们每个项目都有一个单独的logback-<project>.xml和jvm opt用于运行时。理智恢复了,谢谢。 - Vaughn Dickson
2
测试jar包的依赖有点麻烦;尝试将要重用的测试代码移动到自己的正确模块中,然后将其logback-test.xml放置在正确的位置{module}/src/test/resources/logback-test.xml,这样它仅对此模块中的测试可用,并且maven-jar-plugin会自动将其排除在jar构件之外。现在,您的其他模块可以在测试范围内依赖于此测试实用程序jar。(我也曾尝试从一个测试jar中重用代码,在其他模块的其他测试中,但最终将其重构为自己的模块。) - michael
这是一个优美的解决方案。 - laughing_man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接