我遇到了测试问题,在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
所以我的问题是:
WTF是maven在做类路径吗?
为什么我的log4j.properties最终没有出现在类路径上?
如何调试?
注意:在Eclipse中,我可以正常运行测试,一切都按预期工作。
另一个注意事项:maven项目是一个多模块项目,我只是从一个子模块执行单个测试,命令行如下:
mvn -U -Dtest=de.company.project.SomeTest clean test
答案 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中的破损点,但这是一个不同日子的故事。