我正在制作一个在测试阶段运行的maven插件,在使用我的插件的项目的pom.xml配置中,我设置了一个我想要用来运行该类的类规范名称从我的插件中,基本上我正在设法从我的插件中在项目内部动态类加载类。
Class clazz = Class.forName("... class from pom.xml ...")
当我运行它时,我收到了可预期的" ClassNotFoundException",似乎类加载器不相同或不共享。
有办法吗?就像从项目中捕获类加载器或通过依赖注入接收到我的插件?什么是最好的方式?
答案 0 :(得分:1)
我们可以在mojo中使用Hibernate实现,可以作为参考来实现它:
private ClassLoader getClassLoader(MavenProject project)
{
try
{
List classpathElements = project.getCompileClasspathElements();
classpathElements.add( project.getBuild().getOutputDirectory() );
classpathElements.add( project.getBuild().getTestOutputDirectory() );
URL urls[] = new URL[classpathElements.size()];
for ( int i = 0; i < classpathElements.size(); ++i )
{
urls[i] = new File( (String) classpathElements.get( i ) ).toURL();
}
return new URLClassLoader( urls, this.getClass().getClassLoader() );
}
catch ( Exception e )
{
getLog().debug( "Couldn't get the classloader." );
return this.getClass().getClassLoader();
}
}
要捕获“project”对象,我们可以使用mojo依赖注入:
/**
* Dependency injected
*/
@Parameter(defaultValue = "${project}")
public MavenProject project;
并使用它在项目类加载器中加载一些类:
getClassLoader(this.project).loadClass("com.somepackage.SomeClass")