在Tycho中运行单元测试失败:解决google-collections而不是Guava

时间:2013-04-03 18:35:32

标签: eclipse-plugin guava tycho

由于不正确的依赖关系解析,我在使用tycho运行测试时出现问题,不知何故,将旧版Google Collections .jar放在类路径而不是Guava版本上,尽管事实上并非如此。我的poms是否指定了对集合的依赖(只有番石榴)。

我的单元测试由于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>

短语'google collections'似乎没有出现在哪里。我指定的唯一其他存储库是:

<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似乎已经无处可去了,我不知道如何阻止它。只要它被解决,我的单元测试就会失败。如何阻止Tycho尝试使用旧的Google Collections?

只是澄清一下,这并没有停止建设和部署;插件更新站点位于CI平台上,我们已经能够在不同的Eclipse IDE上安装插件,因此这个问题只会影响测试。

如果需要其他信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

插件com.google.collect 0.8.0.v201102150722是您在POM中配置的Helios p2存储库的一部分。这意味着此插件是target platform的一部分,因此可用于解决依赖关系。

如果要确保不使用该捆绑包,请确保它不是目标平台的一部分。在您的情况下,最简单的方法是明确remove the plug-in from the target platform

<plugin>
   <groupId>org.eclipse.tycho</groupId>
   <artifactId>target-platform-configuration</artifactId>
   <version>${tycho-version}</version>
   <configuration>
      <filters>
         <filter>
            <type>eclipse-plugin</type>
            <id>com.google.collect</id>
            <removeAll />
         </filter>
      </filters>
   </configuration>
</plugin>

接下来,您需要确保guava插件是目标平台的一部分。您可以通过以下方式add an artifact from a Maven repository to the target platform

  • 声明对POM的dependencies部分中的工件的Maven依赖关系。您已经正确完成了这项工作。
  • 在Tycho的<pomDependencies>插件上将配置参数consider设置为target-platform-configuration

请注意,这通常仅在引用的工件已经是OSGi包时才有效。这就是这种情况:com.google.guava:guava:14.0.1似乎有OSGi所需的所有清单头。

这应该可以为您提供所需的结果:在测试运行时,现在应该使用guava来匹配您的com.google.common.*包导入。


关于在Tycho中声明依赖关系的另一个一般性评论:在Tycho中,您只能在PDE源文件META-INF/MANIFEST.MFfeature.xml等中声明依赖关系。

在POM中声明的普通Maven样式依赖项为项目添加依赖项。如上所述,POM依赖性可以仅向目标平台添加工件,即Tycho可以使用的工件集来解析在PDE源文件中声明的依赖性。所以最后,POM依赖可能成为已解析依赖项的一部分,但前提是依赖解析器选择它以匹配其中一个声明的依赖项。

答案 1 :(得分:0)

默认情况下,tycho会将您在本地maven repo中安装的任何p2工件添加到目标平台。如果捆绑com.google.collect导出您导入的包,则可以将其连线。

要阻止tycho包含任何本地安装的工件,您可以使用-Dtycho.localArtifacts = ignore(或者从本地maven存储库中删除不需要的包)

请参阅http://wiki.eclipse.org/Tycho/Release_Notes/0.16#Improvements_and_Fixes