0

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

你有什么线索吗?

4

1 回答 1

1

在幕后,Quarkus 使用 Jandex 来索引您的资源。这是 Jandex 提供的,CombinedIndexBuildItem因此您需要所有外部 jar 都由 Jandex 索引。

为此,您可以将 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

于 2020-01-07T10:44:27.703 回答