在项目中遇到一个奇怪的现象,一个单元测试(Junit)在IDE中可以执行正确,但是使用Maven Test得不到正确结果。
1. 问题
经过一阵子的调试跟踪发现了问题所在。
假设测试在B模块中,但是依赖了A模块的方法a。B模块的单元测试b使用了a, a的初始化要使用A.jar包内的资源文件。
在IDE中,a是可以正确的找到A.jar的资源的。但是在Maven Test是找不到,所以初始化失败。
2. 分析
初步分析应该是IDE和MAVEN入口不一样。
IDE启动的是直接java 命令,命令中已经给那些依赖的jar 添加到了classpath 中了,
Maven surefire, 如果那个参数没打开的话,就只会设置jvm的classpath 做为参数。
其实这个surefire 2.4 引入的。如果maven 退回到2.3或者更早,应该也没问题了。
3. 解决办法
加入参数useSystemClassLoader
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<forkCount>1</forkCount>
<reuseForks>false</reuseForks>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
4. 进一步分析
对比一下这个参数设置与否的Maven Test Trace.
1. 不设置
Forking command line: cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_131\jre\bin\java" -jar D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefirebooter7283450230329668804.jar D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefire4601787208340921585tmp D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefire_05380039621346427331tmp"
2. useSystemClassLoader = false
Forking command line: cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_131\jre\bin\java" org.apache.maven.surefire.booter.ForkedBooter D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefire345966431011675942tmp D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefire_05131872906470095968tmp"
网友评论