【问题标题】:What is Maven doing with my testclasspathMaven 对我的 testclasspath 做了什么
【发布时间】:2013-03-07 22:19:23
【问题描述】:

我遇到了一个测试问题,在 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从测试本身打印了类路径

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

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

所以我的问题是:

  1. maven 正在处理类路径?

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

  3. 我该如何调试?

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

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

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

【问题讨论】:

  • 如果您尝试从多模块构建中运行单个模块,您需要使用 -pl 或者 -amd 而不是进入适当的文件夹。此外,查看完整的 pom.xml 以了解问题可能出在哪里会很有帮助。
  • 虽然这些选项肯定很有帮助,但我看不出它们与手头的问题有什么关系!?主要区别似乎是 -pl 实际上将使用本地构建工件,而进入目录则使用存储库中的工件。

标签: maven log4j classpath surefire


【解决方案1】:

我找到了问题 1 的答案。

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

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

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

留给我第二个问题。

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

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

【讨论】:

    【解决方案2】:

    好好看看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
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多