4

我遇到了一个测试问题,在 maven 中执行该测试时无法初始化 log4j,尽管有效的 log4j.properties 位于 src/test/resources 中,因此应该最终出现在测试的类路径中。但它没有,即 log4j 只打印

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.

为了调试问题,我从测试本身打印了类路径,使用这里的代码

但是我得到的不是一长串的罐子和路径

/<projectpath>/target/surefire/surefirebooter6226797341642271676.jar

所以我的问题是:

  1. WTF 是 maven 处理类路径吗?

  2. 为什么我的 log4j.properties 没有出现在类路径中?

  3. 我该如何调试?

注意:在 Eclipse 中,我可以很好地运行测试,并且一切都按预期工作。

另一个注意事项:maven 项目是一个多模块项目,我只从单个子模块执行单个测试,命令行如下:

mvn -U -Dtest=de.company.project.SomeTest clean test
4

2 回答 2

3

好好看看maven-surefire-plugin。默认情况下,它会创建一个装满整个类路径的 jar。这由useManifestOnlyJar选项控制。这解决了 Windows 的类路径限制为 1024 的问题(引用我的头顶)。在 Linux 下,您不会真正感受到这种痛苦,因为限制要高得多。

如果您要分叉 maven-surefire-plugin,它将使用与您正在运行 Maven(和编译)的类路径不同的类路径。

调试这种蹩脚的情况可以如下进行:

  • 在您的一个测试中添加一个循环,列出所有环境变量以及 java 系统属性。

  • 调试测试:

    mvn -Dmaven.surefire.debug="-Xdebug \
        -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9001 \
        -Xnoagent" \
        test
    
于 2013-03-19T15:23:59.103 回答
0

我找到了问题 1 的答案。

Maven 会即时创建具有奇怪名称的 jar,并在其中放置一个 MANIFEST.MF 文件。该文件包含类路径和要启动的主类。

这也回答了一些扩展问题 3。

您可以在 maven 运行时将该 jar 文件复制到其他地方,因此一旦完成就不会删除它。然后,您可以根据需要检查它。原来我的 log4.properties 在类路径上(测试类的目标目录在那里,属性文件在那个目录中......)

留给我第二个问题。

原来在 pom.xmls 森林的某个地方,系统属性 log4j.configuration 被设置为一个相当无用的值。如此处所述,将该值设置回正确值解决我的直接问题。

现在我只需要在我们的 poms 中找到破损的地方,但这是另一天的故事。

于 2013-03-19T13:13:42.413 回答