Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ivy appears to fetch javadoc jars only

Tags:

java

ivy

I'm using Ivy on my project, with the Ivy Eclipse plugin.

It appears that certain jars which are downloaded and added to my project are the javadoc jars, not the jars with the actual code. Note - this doesn't happen with all jars.

For example, adding this to my ivy.xml file:

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

caused the javadocs for junit to be downloaded and added to my classpath: enter image description here

This breaks compilation for my project, as none of the unit tests are working.

This was working fine until I added a reference to Spring, and everything broke. I've tried removing the reference, and deleting junit from my local cache to force ivy to fetch it again, but the problem persists.

Here's my total dependency block (with spring removed):

<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>

Here's my ivysettings.xml for the project:

<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>
like image 454
Marty Pitt Avatar asked Dec 16 '22 17:12

Marty Pitt


1 Answers

Some open source modules include optional java doc jars. To remove them add a configuration mapping to each of your dependencies:

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

The default configuration in ivy is equivalent to the the compile scope in a maven module. This is how the optional libraries can be automatically omitted. (Check their POMs).

A better approach is to declare your own configurations and the default mapping as follows:

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

Then in your ivy file you only need to declare the non-standard configurations:

<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>

In this case we only want the 3 test libraries to appear on the test configuration.

Still confused? The magic of ivy configurations is when you use them to manage your build's class path

  <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>

This is what Maven is doing when you declare a scope tag on a dependency, for example:

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

The scopes in Maven are fixed. In ivy you can have as many as you need.

like image 115
Mark O'Connor Avatar answered Feb 02 '23 03:02

Mark O'Connor