我创建了一个自定义的Maven插件,如下所示:
@Mojo(name="generate", defaultPhase = LifecyclePhase.PREPARE_PACKAGE)
public class HandlerGeneratorMojo extends AbstractMojo {
...
}
我是这样使用它的:
<!-- GENERATE EVENT HANDLERS (POC) -->
<plugin>
<artifactId>handler-generator-maven-plugin</artifactId>
<groupId>my.group.id</groupId>
<version>${revision}</version>
<executions>
<execution>
<id>generate handlers</id>
<phase>prepare-package</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
...
</configuration>
</execution>
</executions>
</plugin>
在Mojo的执行方法中,我尝试使用Reflections api检索扩展接口CdsData的所有接口。
final Reflections reflections = new Reflections();
final Set<Class<? extends CdsData>> allClasses =
reflections.getSubTypesOf(CdsData.class);
log.info("Number of results: " + allClasses.size());
for (final Class<? extends CdsData> cdsDataClass: allClasses) {
log.info("Result: " + cdsDataClass);
}
我得到了五个结果,这些结果位于我执行插件的pom的依赖项中。所以没关系。 但是,我也使用另一个插件(cds4j-maven-plugin(生成了一些实现,该插件已设置
<phase>generate-sources</phase>
并且我尝试将自定义插件的阶段设置为准备包,以便在上述插件生成源代码后执行它。 但是,我得到的结果没有比我之前提到的五个结果更多。我也希望看到那些生成的接口。
这可能是类路径或类加载器问题?或者阶段?
我还尝试将生成的类的包放在反射构造函数中,并且我尝试配置反射类加载,如第 8 行所述:https://www.hellojava.com/a/80798.html
任何帮助不胜感激!谢谢!
干杯 凯尔德
好的,终于解决了。这绝对是一个类加载问题。我需要添加一个指向类路径元素的类加载器,如下所述:http://blog.chalda.cz/2018/02/17/Maven-plugin-and-fight-with-classloading.html
我将范围更改为进程类,基本上更改了博客中描述的所有内容,并使用了:
Reflections reflections = new Reflections(classLoader, sourcePackage);
其中类加载器是按照该博客中的说明组合在一起的类加载器,而 sourcePackage 是一个字符串,其中包含我想要的结果类型的包前缀。
希望这对其他人有所帮助。
谢谢。