用于读取应用程序类和生成 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的主要内容,如果未能解决你的问题,请参考以下文章