我在使用 tycho 运行测试时遇到问题,因为依赖解析不正确,不知何故,将旧的 Google Collections .jar 放在类路径上,而不是 Guava 上,尽管事实上我的任何 pom 中都没有我指定了对集合的依赖(只有番石榴)。
我的单元测试因 NoSuchMethodError (ImmutableList.copyOf)、NoClassDefFoundError (Joiner) 之类的事情而失败,我几乎将其缩小为“找到错误的 jar”。当在 Eclipse 中手动运行时,这些相同的测试也会通过。
这是pom的相关部分:
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
</dependency>
...
</dependencies>
短语“谷歌收藏”出现在任何地方。我指定的唯一其他存储库是:
<repositories>
<repository>
<id>helios</id>
<layout>p2</layout>
<url>http://download.eclipse.org/releases/helios</url>
</repository>
</repositories>
我的插件将“com.google.common.base”和“com.google.common.collect”作为导入包导入。我在工作区中有自己的捆绑版本的 Guava 14 用于调试,但在 POM 中我选择不使用本地模块。
我按照 Sean Patrick Floyd 对这个问题的回答(JUnit throws java.lang.NoSuchMethodError For com.google.common.collect.Iterables.tryFind),并让我的测试抛出一个异常,其中包含 Iterables 类所在的 .jar 的位置从加载。它吐了出来:
java.lang.IllegalArgumentException: file:/C:/Documents and Settings/Erika Redmark/.m2/repository/p2/osgi/bundle/com.google.collect/0.8.0.v201102150722/com.google.collect-0.8.0.v201102150722.jar
这就是我现在卡住的地方。这个 google-collections jar 似乎不知从何而来,我不知道如何阻止它。只要它被解决,我的单元测试就会失败。如何阻止第谷尝试获取旧的 Google 收藏?
澄清一下,这并没有停止构建和部署;插件更新站点在 CI 平台上,我们已经能够在不同的 Eclipse IDE 上安装插件,所以这个问题只影响测试。
如果需要更多信息,请告诉我。