java Maven插件:访问与运行测试时“相同的类加载器”?

5kgi1eie  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(128)

我正在尝试开发一个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 的起点来实现这一点。

axkjgtzd

axkjgtzd1#

您可以通过调用project.getArtifacts()来访问依赖项。
此项目具有的所有依赖项,包括可传递的依赖项。内容是延迟填充的,因此根据哪些阶段在某些范围内运行了依赖项,将不包括这些依赖项。例如,如果只运行了编译阶段,则将不包括具有范围测试的依赖项。
可以使用@Mojo上的属性来控制可用的依赖项。具体来说,需要将requiresDependencyResolutionrequiresDependencyCollection都设置为ResolutionScope.TEST

相关问题