代码之家  ›  专栏  ›  技术社区  ›  Emmanuel Touzery

maven mojo用于读取应用程序类和生成java

  •  0
  • Emmanuel Touzery  · 技术社区  · 6 年前

    所以我写了一个魔咒,继承自 AbstractMojo ,并完成项目:

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

    我有大部分代码,我的mojo确实得到了执行,但我在正确的构建阶段插入mojo时遇到了困难。

    如果我这样插上插头:

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

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

    请注意,我使用 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其余部分一起编译的代码?

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Emmanuel Touzery    6 年前

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

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