Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven对我的testclasspath做了什么_Maven_Log4j_Classpath_Surefire - Fatal编程技术网

Maven对我的testclasspath做了什么

Maven对我的testclasspath做了什么,maven,log4j,classpath,surefire,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

我遇到了一个测试的问题,在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的答案

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

这也回答了一些问题3

当maven运行时,您可以将该jar文件复制到其他地方,这样一旦完成,它就不会删除它。然后你可以随时检查它。原来我的log4.properties在类路径上(TestClass的目标目录在那里,属性文件在该目录中……)

给我留下问题2

结果发现,在pom.xmls的林中,系统属性log4j.configuration被设置为一个相当无用的值。如前所述,将该值设置回正确的值解决了我眼前的问题

现在我只需要在我们的POM中找到断点,但这是另一天的故事。

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

如果您正在分叉maven surefire插件,它将使用与您正在运行的maven(以及编译)不同的类路径

调试这种糟糕的情况可以按如下方式进行:

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

  • 调试测试:

    mvn -Dmaven.surefire.debug="-Xdebug \
        -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9001 \
        -Xnoagent" \
        test
    

如果您试图从多模块构建中运行单个模块,则需要使用-pl和-amd,而不是进入相应的文件夹。此外,查看完整的pom.xml将有助于了解问题可能出在哪里。虽然这些选项确实很有帮助,但我看不出它们与手头的问题有什么关系!?主要的区别似乎是-pl将实际使用本地构建工件,而更改为目录将使用存储库中的工件。
mvn -Dmaven.surefire.debug="-Xdebug \
    -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9001 \
    -Xnoagent" \
    test