Невозможно найти классы с помощью org.reflections.Reflections внутри настраиваемого плагина Maven
Я создал собственный плагин 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 я пытаюсь получить все интерфейсы, расширяющие интерфейс CdsData, с помощью API Reflections.
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>
И я попытался установить фазу моего настраиваемого плагина на prepare-package, чтобы он выполнялся после того, как вышеуказанный плагин сгенерировал источники. Однако я получаю не больше результатов, чем пять, о которых упоминал ранее. Я ожидал увидеть и эти сгенерированные интерфейсы.
Может быть, это проблема пути к классам или загрузчика классов? Или, может быть, фазы?
Я также попытался поместить пакет сгенерированных классов в конструктор Reflections, и я попытался настроить загрузку класса Reflections, как описано здесь в строке 8: https://www.hellojava.com/a/80798.html
Любая помощь приветствуется! Спасибо!
Ура, Кьельд
1 ответ
Хорошо, наконец, решил. Это определенно была проблема с загрузкой класса. Мне нужно было добавить загрузчик классов, который указывает на элементы пути к классам, как описано здесь: http://blog.chalda.cz/2018/02/17/Maven-plugin-and-fight-with-classloading.html
Я изменил область видимости на классы процессов, в основном изменил все, как описано в блоге, и использовал:
Reflections reflections = new Reflections(classLoader, sourcePackage);
Где classloader - это загрузчик классов, который собран, как описано в этом блоге, а sourcePackage - это строка, содержащая префикс пакета для результирующих типов, которые я хочу.
Надеюсь, это поможет кому-нибудь еще.
Спасибо.