【问题标题】:JUnit throws java.lang.NoSuchMethodError For com.google.common.collect.Iterables.tryFindJUnit 为 com.google.common.collect.Iterables.tryFind 抛出 java.lang.NoSuchMethodError
【发布时间】:2014-02-17 23:28:53
【问题描述】:

我使用的是 Google Guava v13.0,但是当我使用包含 tryFind 的代码运行 JUnit 测试时,我收到以下消息:

java.lang.NoSuchMethodError: com.google.common.collect.Iterables.tryFind(Ljava/lang/Iterable;Lcom/google/common/base/Predicate;)Lcom/google/common/base/Optional;

这似乎只发生在 JUnit 测试中,因为当生产代码运行时没有问题。我正在使用 Intellij IDEA v11.1.3,可以导航到 guava JAR 文件以在 com.google.common.collect.Iterable.class 中找到 tryFind。

我看过类似的帖子,但我不确定这与 JUnit 有何关系。关于我的问题的任何想法?

【问题讨论】:

  • 你用maven吗?也许罐子不在范围内?
  • 这似乎更可能是类路径或构建框架问题,而不是 Guava 问题。
  • 我们不使用 Maven。所有库都是手动添加到项目中的。
  • @atamanroman; AFAIK,丢失的 jar 永远不会导致 NoSuchMethodError,因为你首先得到 NoSuchClassException
  • @maaartinus true,好像包含了不同版本的番石榴

标签: java junit guava nosuchmethoderror


【解决方案1】:

除了您尝试使用的较新版本之外,此类错误通常是由在类路径中具有较旧版本的 Guava(甚至是 google-collections)引起的。尝试在运行测试时检查类路径上的内容。

【讨论】:

  • 这绝对是问题所在,@Sean 下面的代码向我展示了问题所在:javaee-reference-6.0-glassfish-3.1.2.jar。关于如何解决这个问题的任何想法?
  • 我在项目的一个依赖项中有一个对 guava-collection 版本 r03 的依赖项。
【解决方案2】:

按照 Colin 的回答,这是检测内容加载位置的好方法:

System.out.println(
    Iterables.class.getProtectionDomain().getCodeSource().getLocation()
);

这应该打印出你正在使用的番石榴(或 g-c)版本的路径。

【讨论】:

  • @ColinD 回答正确,但这就是帮助我找到它的原因。它在 javaee-reference-6.0-glassfish-3.1.2.jar 中。关于如何解决这个问题的任何想法?
  • @dprice 摆脱那个 jee-Jar。如果您在生产中使用 glassfish,它将提供所有这些。对于测试范围,不包括完整的 jee 包,只包括你需要的
  • 这很有帮助。 Iterables 被埋在 MyEclipse 插件中!
  • 确实很有帮助!我在同时加载 google-collections-1.0.jar 和 guava-20.0.jar 时遇到了类似的问题。我不得不删除 google-collections-1.0.jar
猜你喜欢
  • 2021-03-15
  • 1970-01-01
  • 2020-06-13
  • 2013-07-24
  • 1970-01-01
  • 2016-12-08
  • 2016-10-04
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多