【问题标题】:Access project classes from a maven plugin从 Maven 插件访问项目类
【发布时间】:2018-04-09 16:39:25
【问题描述】:

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

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

当我运行它时,我收到了预期的“ClassNotFoundException”,似乎类加载器不一样或不共享。

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

【问题讨论】:

  • 您尝试加载的类是否在插件中定义?如果没有,您是否在 pom 的 <plugin> 定义中添加了包含此类的 lib <dependency>
  • @Antot 我已将 <dependency> 包含在项目的 pom 中,也包含在 <build> 中以供使用。但是在执行期间,我想从 maven 插件加载(或实际运行它)。
  • 能否分享一下项目和插件中pom.xml 的摘录?
  • 我有类似的要求,我使用了这个解决方案。在我的 mojo 中复制上面的 getClassLoader() 方法,注入 MavenProject 并使用 pom.xml 中定义的类名调用 getClassLoader()。它仍然不适合我。我得到 ClassNotFoundException。知道可能是什么问题吗?

标签: java maven plugins classpath classloader


【解决方案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();
        }
    }

要捕获“项目”对象,我们可以使用 mojo 依赖注入:

/**
 * Dependency injected
 */
 @Parameter(defaultValue = "${project}")
 public MavenProject project;

并使用它在项目类加载器中加载一些类:

getClassLoader(this.project).loadClass("com.somepackage.SomeClass")

【讨论】:

  • 我有类似的要求,我使用了这个解决方案。在我的 mojo 中复制上面的 getClassLoader() 方法,注入 MavenProject 并使用 pom.xml 中定义的类名调用 getClassLoader()。它仍然不适合我。我得到 ClassNotFoundException。知道可能是什么问题吗?
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2019-09-02
相关资源
最近更新 更多