Maven Mojo用于阅读应用程序课程并生成Java



我想编写一个Maven插件,该插件将在构建时间探索我的应用程序的类Path,搜索具有一定注释的类,并生成一些Java代码,以添加这些类的实用程序,这些类别为这些类别添加了实用程序应该在应用程序的罐子中编译。

所以我写了一个从AbstractMojo继承的Mojo,并通过:

获得项目
@Parameter(defaultValue = "${project}", readonly = true, required = true)
private MavenProject project;

我有大部分代码,而我的Mojo确实会被执行,但是我在正确的构建阶段插入Mojo很难。

如果我这样插入:

@Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES,
      requiresDependencyResolution = ResolutionScope.COMPILE)

然后,我生成的Java代码已在JAR文件中编译。

请注意,我使用project.addCompileSourceRoot注册输出文件夹。

,但这对我来说还不够,因为它在构建中为时过早:我无法阅读课堂路径并从项目中找到课程。我认为它们还没有编译。

我搜索类似的课程:

        final List<URL> urls = List.ofAll(project.getCompileClasspathElements())
                .map(element -> Try.of(() -> new File(element).toURI().toURL()).get());
        final URLClassLoader classLoader = new URLClassLoader(urls.toJavaList().toArray(new URL[0]), Thread.currentThread().getContextClassLoader());
        final Set<Class<?>> entities = HashSet.ofAll(new Reflections(classLoader).getTypesAnnotatedWith(MyAnnotation.class));

(我正在使用vavr,但无论如何您都会得到要旨(

因此,通过在GENERATE_SOURCES阶段插入我的代码,此代码不起作用,我找不到任何类。

但是,如果我在PROCESS_CLASSES阶段插入MOJO:

@Mojo(name = "generate", defaultPhase = LifecyclePhase.PROCESS_CLASSES,
    requiresDependencyResolution = ResolutionScope.COMPILE)

然后找到我的类,我可以从应用程序中访问其余的代码,但是尽管使用了addCompileSourceRoot

我如何同时获得两个功能:能够从应用程序的其余部分探索代码生成代码的能力,该代码将与JAR的其余部分一起编译?

我想一个可能的答案是"你不能",但据我所知,querydsl和immmutables正在这样做(我尝试阅读他们的来源,但找不到相关代码(。

所以@khmarbaise是对的,我想要的不是Maven Mojo,而是Maven注释处理器。

我发现本演练对创建一个演练非常有帮助,而且这个堆叠的答案也派上用场。

相关内容

  • 没有找到相关文章

最新更新