从maven插件访问项目类

时间:2018-04-09 16:39:26

标签: java maven plugins classpath classloader

我正在制作一个在测试阶段运行的maven插件,在使用我的插件的项目的pom.xml配置中,我设置了一个我想要用来运行该类的类规范名称从我的插件中,基本上我正在设法从我的插件中在项目内部动态类加载类。

Class clazz = Class.forName("... class from pom.xml ...")

当我运行它时,我收到了可预期的" ClassNotFoundException",似乎类加载器不相同或不共享。

有办法吗?就像从项目中捕获类加载器或通过依赖注入接收到我的插件?什么是最好的方式?

1 个答案:

答案 0 :(得分:1)

我们可以在mojo中使用Hibernate实现,可以作为参考来实现它:

在此处查看源代码:http://grepcode.com/file/repo1.maven.org/maven2/org.codehaus.mojo/hibernate3-maven-plugin/2.2/org/codehaus/mojo/hibernate3/HibernateExporterMojo.java#HibernateExporterMojo.getClassLoader%28%29

    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")