1

我在使用 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 上安装插件,所以这个问题只影响测试。

如果需要更多信息,请告诉我。

4

2 回答 2

1

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

如果要确保不使用捆绑包,请确保它不是目标平台的一部分。在您的情况下,最简单的方法是从目标平台显式删除插件

<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 插件是目标平台的一部分。您可以通过以下方式将 Maven 存储库中的工件添加到目标平台

  • dependencies在 POM 部分中声明对工件的 Maven 依赖项。你已经正确地做到了。
  • 将配置参数设置<pomDependencies>considerTycho 的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 依赖可能成为已解析依赖的一部分,但前提是依赖解析器选择它来匹配声明的依赖之一。

于 2013-04-04T12:52:56.217 回答
0

默认情况下,tycho 会将您在本地 maven 存储库中安装的任何 p2 工件添加到目标平台。如果 bundle com.google.collect 导出了你导入的包,它可能是有线的。

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

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

于 2013-04-04T08:09:16.600 回答