在maven mojo中加载项目类



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

不幸的是,这个操作失败了,因为类加载器缺少一个引用的类。环顾四周,我已经发现了Maven mojo插件从托管项目加载类的方法,并且Maven插件可以';t荷载等级

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

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

当我查看创建的类加载器的类路径元素时,我看到mongoodb-driver-sync.jar被包括在内,但由于它声明了";org.mongodb:bson"作用域的依赖关系为它提供了接口仍然不在类路径中。

所以,最后一个问题是:我如何加载一个引用";间接的";依赖?

我注意到,

project.getArtifacts()

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

因此,通过额外的研究,我发现Custom Maven插件开发-getArtifacts是空的,尽管其中包括依赖项,这建议调整@Mojo注释:

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

在调整注释之后;project.getCompileClasspathElements((&";,再也没有必要对工件进行迭代了。

相关内容

  • 没有找到相关文章

最新更新