2011-02-13 45 views
3

我在我的项目上使用Ivy Eclipse插件。常春藤似乎只拿javadoc罐子

看来,下载并添加到我的项目中的某些罐子是javadoc罐子,而不是具有实际代码的罐子。请注意 - 所有罐子都不会发生这种情况。

例如,添加这个我ivy.xml文件:

<dependency org="junit" name="junit" rev="4.8.2"/> 

造成的Javadoc JUnit来下载并添加到我的类路径: enter image description here

这打破编译我的项目,因为没有单元测试正在工作。

这工作正常,直到我添加了对Spring的引用,并且一切都打破了。我尝试删除引用,并从我的本地缓存中删除junit强制ivy重新获取它,但问题仍然存在。

这里是我的总抚养块(弹簧删除):

<dependencies> 
    <dependency org="org.hamcrest" name="hamcrest-library" rev="1.3.RC2"/> 
    <dependency org="junit" name="junit" rev="4.8.2"/> 
    <dependency org="org.mockito" name="mockito-core" rev="1.8.5"/> 
    <dependency org="javax.persistence" name="persistence-api" rev="1.0"/> 
</dependencies> 

这里是我ivysettings.xml项目为:

<ivysettings> 

    <caches artifactPattern="[organisation]/[module]/[revision]/[artifact].[ext]" /> 
    <settings defaultResolver="local.ibiblio.jboss.java-net.springsource" checkUpToDate="true" /> 

    <resolvers> 
     <chain name="local.ibiblio.jboss.java-net.springsource"> 
      <filesystem name="libraries"> 
       <artifact pattern="${basedir}/ivy-repo/[artifact]-[revision].[type]" /> 
      </filesystem> 
      <ibiblio name="ibiblio" m2compatible="true" /> 
      <ibiblio name="jboss" m2compatible="true" 
       root="https://repository.jboss.org/nexus/content/groups/public-jboss" /> 
      <ibiblio name="java.net" m2compatible="true" 
       root="https://repository.jboss.org/nexus/content/repositories/java.net-m2/" /> 
      <ibiblio name="java.net" m2compatible="true" 
       root="http://repository.codehaus.org/" /> 
      <url name="com.springsource.repository.libraries.release"> 
       <ivy pattern="http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
       <artifact pattern="http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
      </url> 

      <url name="com.springsource.repository.libraries.external"> 
       <ivy pattern="http://repository.springsource.com/ivy/libraries/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
       <artifact pattern="http://repository.springsource.com/ivy/libraries/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
      </url> 
      <url name="com.springsource.repository.bundles.release"> 
       <ivy pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
       <artifact pattern="http://repository.springsource.com/ivy/bundles/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
      </url> 

      <url name="com.springsource.repository.bundles.external"> 
       <ivy pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
       <artifact pattern="http://repository.springsource.com/ivy/bundles/external/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" /> 
      </url> 
     </chain> 

    </resolvers> 
</ivysettings> 

回答

10

一些开源模块包括可选的Java文档罐子。要删除它们添加配置映射到每个依赖关系:

<dependency org="junit" name="junit" rev="4.8.2" conf="default"/> 

默认常春藤配置相当于一个Maven模块中的编译范围。这是可以自动省略可选库的方式。 (检查他们的POM)。

更好的方法是如下声明自己的配置和默认映射:

<configurations defaultconfmapping="compile->default"> 
    <conf name="compile" description="Required to compile code"/> 
    <conf name="test" description="Additional test dependencies" extends="compile" /> 
</configurations> 

然后在你的ivy文件,你只需要声明的非标准配置:

<dependencies> 
    <dependency org="org.hamcrest" name="hamcrest-library" rev="1.3.RC2" conf="test->default"/> 
    <dependency org="junit" name="junit" rev="4.8.2" conf="test->default"/> 
    <dependency org="org.mockito" name="mockito-core" rev="1.8.5" conf="test->default"/> 
    <dependency org="javax.persistence" name="persistence-api" rev="1.0"/> 
</dependencies> 

在这种情况下,我们只希望3个测试库出现在测试配置中。

还困惑吗?常春藤配置神奇的是,当你用它来管理你的编译的类路径

<target name='dependencies' description='Resolve project dependencies and set classpaths'> 
    <ivy:resolve/> 

    <ivy:cachepath pathid="compile.path" conf="compile"/> 
    <ivy:cachepath pathid="test.path"  conf="test"/> 
    </target> 

这是Maven是做的时候,你有依赖性声明范围标记,例如:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.8.2</version> 
    <scope>test</scope> 
</dependency> 

Maven中的范围是固定的。在常春藤你可以拥有尽可能多的你需要的东西。

+0

明智的答案 - 谢谢!我从来不理解常春藤的范围。 – 2011-02-14 14:45:15