Невозможно найти классы с помощью 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 - это строка, содержащая префикс пакета для результирующих типов, которые я хочу.

Надеюсь, это поможет кому-нибудь еще.

Спасибо.

Другие вопросы по тегам