什么是Maven用我的testclasspath做什么

时间:2013-03-19 09:52:16

标签: maven log4j classpath surefire

我遇到了测试问题,在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.

为了调试问题,我使用the code here

从测试本身打印了类路径

但是,我只是获得了一个长长的罐子和路径列表

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

所以我的问题是:

  1. WTF是maven在做类路径吗?

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

  3. 如何调试?

  4. 注意:在Eclipse中,我可以正常运行测试,一切都按预期工作。

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

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

2 个答案:

答案 0 :(得分: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
    

答案 1 :(得分:0)

我找到了问题1的答案。

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

这也回答了一些问题3。

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

给我留下问题2。

事实证明,在pom.xmls的森林中,系统属性log4j.configuration被设置为一个相当无用的值。如上所述here将该值设置回适当的值可以解决我的问题。

现在我只需要找到我们的poms中的破损点,但这是一个不同日子的故事。