从 Maven 插件访问项目 类
Access project classes from a maven plugin
我正在制作一个 运行 在测试阶段的 Maven 插件,在使用我的插件的项目的 pom.xml 配置中,我正在设置一个 class 规范名称我想使用我的插件中的 运行 class,基本上我正在想办法从我的插件中动态 class 加载项目中的 classes .
Class clazz = Class.forName("... class from pom.xml ...")
当我 运行 它收到预期的 "ClassNotFoundException" 时,似乎 class 加载器不相同或不共享。
有办法吗?喜欢从项目中捕获 class 加载器或通过依赖注入接收它到我的插件中?什么是最好的方法?
我们可以使用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;
并使用它在项目 class 中加载一些 class 加载程序:
getClassLoader(this.project).loadClass("com.somepackage.SomeClass")
我正在制作一个 运行 在测试阶段的 Maven 插件,在使用我的插件的项目的 pom.xml 配置中,我正在设置一个 class 规范名称我想使用我的插件中的 运行 class,基本上我正在想办法从我的插件中动态 class 加载项目中的 classes .
Class clazz = Class.forName("... class from pom.xml ...")
当我 运行 它收到预期的 "ClassNotFoundException" 时,似乎 class 加载器不相同或不共享。
有办法吗?喜欢从项目中捕获 class 加载器或通过依赖注入接收它到我的插件中?什么是最好的方法?
我们可以使用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;
并使用它在项目 class 中加载一些 class 加载程序:
getClassLoader(this.project).loadClass("com.somepackage.SomeClass")