我有自定义maven插件,例如,必须在测试阶段以编程方式运行测试。所以我有类似的东西
@Mojo(name = "aggregate", requiresDependencyResolution = ResolutionScope.RUNTIME)
public class AcceptanceTestMojo extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
TestExecutor testExecutor = new TestExecutor();
testExecutor.setTestClasses(new Class[]{TestClass.class});
testExecutor.run();
}
}
所以问题来了,因为TestClass.class来自另一个maven模块,实际上我想要获取的资源被加载到该模块类路径中。在那个TestClass中,我有以下方法:
public Object[][] retrieveFile() throws IOException {
String[] issuesKeys = IOUtils.toString(
Thread.currentThread().getContextClassLoader().getResourceAsStream("fileName"))
.split("\\n");
....
....
}
如果我构建了TestClass所属的模块,那么一切正常,因为Thread.currentThread()。getContextClassLoader()正在加载正确的ClassLoader,但如果用我的插件运行它,因为我以编程方式运行测试Thread.currentThread ()。getContextClassLoader()正在加载我的插件的类路径,因此我想要检索的文件不存在,并且抛出了RuntimeException。
所以我的问题是如何获取正确的ClassLoader以便能够获取文件或者有没有办法用java手动加载类路径中的文件?
答案 0 :(得分:0)
我找到了一个解决方案 - 我修改了currentThread ClassLoader-我从正在执行插件的maven项目的类路径中获得了所有必需的类。注入MavenProject bean可以实现这一点:
@Component
private MavenProject project;