我正在尝试开发一个Maven插件,它可以查找某些类并为它们生成特定的文档。我已经构建了一个POC作为单元测试。我现在正在尝试将其转换为Maven插件。
测试代码可以访问项目的类+任何依赖项的类。我希望在我的Maven插件中可以使用“相同的类加载器”(或具有相同访问权限的类加载器)。
这可能吗?
获取对项目类的访问权限
创建一个包含项目类的类加载器是可行的:
@Mojo(name = "tao-generator", defaultPhase = LifecyclePhase.INSTALL)
public class TaoGeneratorMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}", required = true, readonly = true)
MavenProject project;
...
@SneakyThrows
private ClassLoader getClassLoader(MavenProject project) {
List<URL> runtimeUrls = new ArrayList<>();
List<String> runtimeClasspathElements = project.getRuntimeClasspathElements();
for (int i = 0; i < runtimeClasspathElements.size(); i++) {
String element = runtimeClasspathElements.get(i);
runtimeUrls.add(new File(element).toURI().toURL());
}
URL[] array = new URL[runtimeUrls.size()];
array = runtimeUrls.toArray(array);
return new URLClassLoader(array,
Thread.currentThread().getContextClassLoader());
}
访问依赖项的类
我还没有弄清楚如何创建一个可以访问依赖类的类加载器,我可以从MavenProject project
开始使用类似的技术吗?
另一个Angular :从胖Sping Boot jar装入类
我也尝试过直接从生成的胖Sping Boot jar中加载类。这对一个简单的URLClassLoader不起作用,因为那个类加载器不能从嵌套的jar中加载类。也许这可以作为另一个Angular 的起点来实现这一点。
1条答案
按热度按时间axkjgtzd1#
您可以通过调用
project.getArtifacts()
来访问依赖项。此项目具有的所有依赖项,包括可传递的依赖项。内容是延迟填充的,因此根据哪些阶段在某些范围内运行了依赖项,将不包括这些依赖项。例如,如果只运行了编译阶段,则将不包括具有范围测试的依赖项。
可以使用
@Mojo
上的属性来控制可用的依赖项。具体来说,需要将requiresDependencyResolution
和requiresDependencyCollection
都设置为ResolutionScope.TEST
。