由于不正确的依赖关系解析,我在使用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上安装插件,因此这个问题只会影响测试。
如果需要其他信息,请与我们联系。
答案 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:
dependencies
部分中的工件的Maven依赖关系。您已经正确完成了这项工作。<pomDependencies>
插件上将配置参数consider
设置为target-platform-configuration
。请注意,这通常仅在引用的工件已经是OSGi包时才有效。这就是这种情况:com.google.guava:guava:14.0.1
似乎有OSGi所需的所有清单头。
这应该可以为您提供所需的结果:在测试运行时,现在应该使用guava来匹配您的com.google.common.*
包导入。
关于在Tycho中声明依赖关系的另一个一般性评论:在Tycho中,您只能在PDE源文件META-INF/MANIFEST.MF
,feature.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