【问题标题】:Load project class within maven mojo在 maven mojo 中加载项目类
【发布时间】:2021-05-26 10:37:35
【问题描述】:

我正在尝试在执行 maven mojo 期间加载项目类。

很遗憾,此操作失败,因为类加载器缺少引用的类。 环顾四周,我发现了 Maven mojo plugin to load class from hosting projectMaven plugin can't load class 的方法

我结合了这两种方法,最终得到以下代码:

private ClassLoader getClassLoader(final MavenProject project) {

    try {

        final List<URL> classPathUrls = new ArrayList<>();

        // adding the projects dependency jars
        final Set<Artifact> artifacts = getProject().getDependencyArtifacts();
        for (final Artifact artifact : artifacts) {
            classPathUrls.add(artifact.getFile().toURI().toURL());
        }


        // adding the projects classes itself
        final List<String> classpathElements = project.getCompileClasspathElements();
        classpathElements.add(project.getBuild().getOutputDirectory());
        classpathElements.add(project.getBuild().getTestOutputDirectory());
        for (final String classpathElement : classpathElements) {
            classPathUrls.add(new File(classpathElement).toURI().toURL());
        }

        // creating a class loader
        final URL urls[] = new URL[classPathUrls.size()];
        for (int i = 0; i < classPathUrls.size(); ++i) {
            urls[i] = classPathUrls.get(i);
        }
        return new URLClassLoader(urls, this.getClass().getClassLoader());
    } catch (final Exception e) {
        getLog().debug("Couldn't get the classloader.");
        return this.getClass().getClassLoader();
    }
}

加载失败的类是接口“org.bson.codecs.Codec”的实现,包含在“org.mongodb:bson”中,通过依赖隐式导入:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.1.1</version>
    <scope>provided</scope>
</dependency>

这个依赖对另一个jar(范围:提供)有依赖,包含提到的接口,可以在maven依赖树中看到:

$> mvn dependency:tree
[INFO] net.my.project:my-project:jar:1.0-SNAPSHOT
[INFO] +- org.mongodb:mongodb-driver-sync:jar:4.1.1:provided
[INFO] |  +- org.mongodb:bson:jar:4.1.1:provided
[INFO] |  \- org.mongodb:mongodb-driver-core:jar:4.1.1:provided

当我查看创建的类加载器的类路径元素时,我看到 mongodb-driver-sync.jar 包含在内,但由于它声明了具有范围的“org.mongodb:bson”依赖项,因此接口是仍然不在类路径中。

那么,最后一个问题是:如何加载一个从“间接”依赖项中引用类的类?

【问题讨论】:

    标签: java maven classloading maven-mojo


    【解决方案1】:

    我注意到了,那个

    project.getArtifacts()
    

    是空的,尽管 javadoc 说它应该包含所有依赖项(惰性填充)。

    因此,通过额外的研究,我发现Custom Maven Plugin development - getArtifacts is empty though dependencies are included 建议调整@Mojo 注释:

    @Mojo(name = "mojoName", requiresDependencyResolution = ResolutionScope.COMPILE)
    

    调整注解后,使用“project.getCompileClasspathElements();”就足够了,完全不需要遍历工件了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2022-11-30
      • 2012-05-23
      • 2012-09-09
      • 1970-01-01
      • 2014-02-28
      • 2022-07-09
      相关资源
      最近更新 更多