0

我想编写一个 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,这段代码不起作用,我找不到任何类。

PROCESS_CLASSES但是,如果我在阶段插入我的魔力:

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

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

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

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

4

1 回答 1

0

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

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

于 2018-04-18T07:01:34.983 回答