如何在Quarkus中自动注册所有可用的接口实现?

问题描述 投票:0回答:1

我正在尝试使一个库在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的内部并确保所有相关的实现都被手动注册,那么它将更具前瞻性。

您有任何线索吗?

quarkus jandex
1个回答
0
投票

在后台,Quarkus使用Jandex对您的资源进行索引。这是Jandex提供的CombinedIndexBuildItem,因此您需要使用Jandex对所有外部jar进行索引。

为此,您可以将Jandex maven插件添加到那些外部JAR或为每个jar添加一些配置选项:

© www.soinside.com 2019 - 2024. All rights reserved.