扫描仪类型注释从引用的库中使用时未配置扫描程序

2022-09-04 01:15:33

我有一个类,用于在类路径中的类中获取注释。org.reflections.Reflections

当我在同一项目中使用它时,一切都可以正常工作,但是当我将其导出为JAR并将其引用到不同的类中时,我得到以下执行:

Exception in thread "main" org.reflections.ReflectionsException: Scanner TypeAnnotationsScanner was not configured
    at org.reflections.Store.get(Store.java:39)
    at org.reflections.Store.get(Store.java:61)
    at org.reflections.Store.get(Store.java:46)
    at org.reflections.Reflections.getTypesAnnotatedWith(Reflections.java:429)

下面是代码片段:

        System.out.println("Package to Scan: "+getPackageName());
        final Reflections reflections = new Reflections(getPackageName(), new TypeAnnotationsScanner());
        final Set<Class<?>> handlerClasses = reflections.getTypesAnnotatedWith(HandlerMapping.class,true);

我确实提供了一个对象,但问题仍然存在。TypeAnnotationsScanner

注意:仅当上述代码称为jar时,它才起作用。(我使用maven-assembly插件创建了一个胖罐)

任何指针?


答案 1

2021年10月4日更新:

此 bug 已在版本 0.10 中修复。

上一个答案:

也许不是人们想听到的答案类型,但版本包含此处描述的错误:https://github.com/ronmamo/reflections/issues/273reflections0.9.12

此 PR 中提供了错误修复(尚未合并):https://github.com/ronmamo/reflections/pull/278

版本和之间的主要区别在于,在Guava中,依赖性被删除,取而代之的是Java 8 Streams API。0.9.110.9.120.9.12

如果您需要在没有Guava传递依赖关系的情况下包含此依赖项,则可以查看下一个项目:https://github.com/aschoerk/reflections8 目前,最新可用版本是 。请注意,由于发布,现在被认为是过时的,但他们的版本不包含此错误,并且此版本不依赖于番石榴。因此,一个可能的解决方案是切换到 。reflections80.11.7reflections80.9.12reflections0.11.7net.oneandone.reflections8:reflections8:0.11.7


答案 2

使用 0.9.12 的反射库,我发现需要为注释的每个 ElementType 注册扫描仪。

MyAnnotation具有这些元素类型

@Target({ElementType.TYPE,ElementType.FIELD})
public @interface MyAnnotation {

在我的反射代码中,我像这样构造它

Reflections reflections = new Reflections("my.package.*",
        new SubTypesScanner(),
        new TypeAnnotationsScanner(),
        new FieldAnnotationsScanner());

//FieldAnnotationsScanner
Set<Field> fields =  reflections.getFieldsAnnotatedWith(MyAnnotation.class);
System.out.println(fields);