maven mojo用于阅读app类和生成java

时间:2018-03-28 15:08:37

标签: maven code-generation maven-mojo

我想编写一个maven插件,它将在构建时探索我的应用程序的类路径,搜索具有特定注释的类,并生成一些java代码,为这些类添加实用程序,这些代码应该在JAR中编译。应用

所以我写了一个mojo,继承自AbstractMojo,并通过以下方式获得项目:

@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阶段插入我的代码,此代码无法正常工作,而且我找不到任何类。

但是,如果我将我的mojo插入PROCESS_CLASSES阶段:

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

然后找到我的类,我可以从应用程序访问其余的代码,但是我生成的代码在构建中没有考虑到,尽管使用addCompileSourceRoot

如何让两个功能同时工作:从应用程序的其余部分探索代码的能力和生成代码的能力,这些代码将与JAR的其余部分一起编译?

我想一个可能的答案是&#34;你可以&#t;#34;但据我所知,querydslimmmutables正在做(我试过阅读他们的来源但无法找到相关的代码。)

1 个答案:

答案 0 :(得分:0)

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

我发现this walkthrough非常有助于创建一个,this stackoverflow answer也派上用场。