【问题标题】:Guava Google using Reflections in javaGuava Google 在 Java 中使用反射
【发布时间】:2019-11-26 11:27:49
【问题描述】:

我正在尝试在我的 Java 项目中使用反射(也使用 Spring boot),并且我必须获取实现接口的包的所有类。

public static Object[] getClasses(String packageName) throws IOException
  {
    Reflections r = new Reflections(packageName);
    Set<Class<? extends EntityXML>> allClasses = r.getSubTypesOf(EntityXML.class);
    return (Object[]) allClasses.toArray();
  }

但它总是返回这个错误。

java.lang.NoSuchMethodError: com.google.common.collect.Sets$SetView.iterator()Lcom/google/common/collect/UnmodifiableIterator;
        at org.reflections.Reflections.expandSuperTypes(Reflections.java:380)
        at org.reflections.Reflections.<init>(Reflections.java:126)
        at org.reflections.Reflections.<init>(Reflections.java:168)
        at org.reflections.Reflections.<init>(Reflections.java:141)
        at gcs.fds.focus.lib.utils.FindPackages.getClasses(FindPackages.java:14)
        ...

我尝试导入 google.guava 包以避免此错误,它修复了它,但我不想导入它,因为它是一个在我的项目中没有使用的包。

知道如何避免这个错误吗?

【问题讨论】:

  • "这是一个在我的项目中没有使用的包。"错误消息不同意。 您的代码可能不会使用它,但它肯定会在项目中使用。
  • 这不是关于导入,而是关于 google jars 是否在您的构建路径中,以及运行方法时的类路径中。导入只是为代码中的类型名称提供快捷方式。

标签: java spring-boot guava reflections


【解决方案1】:

好吧,我解决了!

我删除了 google.guava 依赖,我做了一个

mvn dependency:tree

在那里我可以看到我的其他依赖项也导入了 google.guava,但是我读到的版本 19 导致了这种冲突。 (everit.json 依赖项),所以我从这个依赖项中排除了 google.guava 并且它可以工作!

<dependency>
    <groupId>org.everit.json</groupId>
    <artifactId>org.everit.json.schema</artifactId>
    <version>1.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
</dependency>

【讨论】:

  • 嗯,这是一个的方法。但是由于 Reflections 引入了 Guava,所以最好明确定义一个版本。否则下次你引入一个带来 Guava 的依赖时,你可能会再次遇到同样的问题。
  • 确实,我要避免导入google.guava 19版
  • 您不必这样做。您可以将已知的工作 Guava 版本(更新的版本)导入您的项目。整个问题是因为您不想显式定义依赖项,因为您认为它没有被使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多