Как автоматически зарегистрировать все доступные реализации интерфейса в Quarkus? - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь адаптировать библиотеку для использования в собственном режиме Quarkus. Так как он требует много размышлений, мне нужно вручную зарегистрировать все реализации определенных интерфейсов.

То, что я сделал до сих пор и что, кажется, отлично работает для пользовательского кода:

private static void registerAllImplementations(CombinedIndexBuildItem combinedIndexBuildItem, 
  BuildProducer<ReflectiveHierarchyBuildItem> reflectiveHierarchyClass,
  Class<?>... classNames) {

    for (Class<?> klass : classNames) {
        combinedIndexBuildItem.getIndex().getAllKnownImplementors(DotName.createSimple(klass.getName())).stream()
          .map(ci -> new ReflectiveHierarchyBuildItem(Type.create(ci.name(), Type.Kind.CLASS)))
          .forEach(reflectiveHierarchyClass::produce);
    }
}

Однако нижеприведенная строка не учитывает разработчиков, исходящих от внешних jar-файлов:

combinedIndexBuildItem.getIndex().getAllKnownImplementors(...)

Это не трагедия, но было бы гораздо более перспективным, если бы не нужно было обращать внимание на внутренности некоторого внешнего jar-файла и убедитесь, что все соответствующие реализации зарегистрированы вручную.

У вас есть какие-либо подсказки?

1 Ответ

1 голос
/ 07 января 2020

За сценой Quarkus использует Jandex для индексации ваших источников. Это Jandex, который предоставляет CombinedIndexBuildItem, поэтому вам нужно, чтобы Jandex проиндексировал весь внешний jar-файл.

Для этого вы можете добавить подключаемый модуль Jandex maven к этим внешним JAR-файлам или добавить некоторые параметры конфигурации для каждого jar-файла:

quarkus.index-dependency.<name>.group-id=
quarkus.index-dependency.<name>.artifact-id=

Более подробная информация здесь: https://quarkus.io/guides/cdi-reference#how-to-generate-a-jandex-index

...