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

Posted

技术标签:

【中文标题】用于读取应用程序类和生成 java 的 maven mojo【英文标题】:maven mojo for reading app classes and generating java 【发布时间】:2018-09-07 08:26:04 【问题描述】:

我想编写一个 maven 插件,它将在构建时探索我的应用程序的类路径,搜索具有特定注释的类,并为这些类生成一些添加实用程序的 java 代码,它们应该在 JAR 的 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:

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

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

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

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

【问题讨论】:

这样的事情应该由一个注解处理器来解决,据我所知,它可以绑定到 maven-compiler-plugin... 啊哈,我明白了。这可以解释为什么我在跟踪不可变或 querydsl 中的代码时遇到了麻烦。也许您可以写一个带有文档或示例链接的答案? PROCESS_CLASSES 在编译之后;您可能需要先运行。你检查了参考? maven.apache.org/ref/3.3.3/maven-core/lifecycles.html PROCESS_SOURCES 呢?如何使用 POM 配置(和更改)阶段以查看哪个有效。最后,也许检查一下 Maven 源代码。 所以我需要在编译后,因为我阅读了现有的代码。 @khmarbaise 如果您创建一个提到注释处理器的答案,我会给您答案 【参考方案1】:

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

我发现this walkthrough 对创建一个很有帮助,而且this *** answer 也派上了用场。

【讨论】:

以上是关于用于读取应用程序类和生成 java 的 maven mojo的主要内容,如果未能解决你的问题,请参考以下文章

java如何通过maven查到所有的java类和方法

Screw工具基本使用:一键生成Java实体类和数据库文档

Screw工具基本使用:一键生成Java实体类和数据库文档

Screw工具基本使用:一键生成Java实体类和数据库文档

Maven:从编译中排除目标/生成源

[java 2020-04-24] springboot生成的jar包没有主类和依赖jar包