Java开发中一些编译测试问题 之一

在项目中遇到一个奇怪的现象,一个单元测试(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"

4. 参考

Surefire ClassLoader

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容