ICR
ICR

Reputation: 14162

Ordering Ivy dependencies

I'm struggling to get my head around the exact behaviour of exclusions in Ivy.

In the following Ivy file, why does putting commons-logging before log4j pull in javax.activation and javax.mail from log4j whereas putting it after doesn't.

<ivy-module version="2.0">
    <info organisation="test" module="test" />

    <configurations defaultconfmapping="default->runtime(*)" />

    <dependencies>
        <dependency org="log4j" name="log4j" rev="1.2.15">
            <exclude org="javax.activation" />
            <exclude org="javax.mail" />
        </dependency>
        <dependency org="commons-logging" name="commons-logging" rev="1.1" />

        <exclude org="com.sun.jdmk" />
        <exclude org="com.sun.jmx" />
        <exclude org="javax.jms" />
    </dependencies>
</ivy-module>

Upvotes: 1

Views: 580

Answers (1)

Mark O&#39;Connor
Mark O&#39;Connor

Reputation: 77971

The activation and mail jars are dependencies of commons logging, yet you've excluded them on the log4j dependency...

When you only use a single configuration this sends a mixed message to ivy, should they be excluded or not? The following would be a lot more explicit:

<dependencies>
    <dependency org="log4j" name="log4j" rev="1.2.15"/>
    <dependency org="commons-logging" name="commons-logging" rev="1.1" />

    <exclude org="javax.activation" />
    <exclude org="javax.mail" />    
    <exclude org="com.sun.jdmk" />
    <exclude org="com.sun.jmx" />
    <exclude org="javax.jms" />
</dependencies>

It's less confusing when the excludes are set globally.

If you want to keep the dependency resolution separate then you'll need to set up more than one configuration (think of these as dependency sets):

<ivy-module version="2.0">
    <info organisation="test" module="test" />

    <configurations>
       <conf name="log4j_deps" description="log4j dependencies"/>
       <conf name="commons_deps" description="commons-logging dependencies"/>
    </configurations>

    <dependencies>

        <dependency org="log4j" name="log4j" rev="1.2.15" conf="log4j_deps->runtime">
            <exclude org="javax.activation" />
            <exclude org="javax.mail" />
        </dependency>

        <dependency org="commons-logging" name="commons-logging" rev="1.1" conf="commons_deps->runtime"/>

        <exclude org="com.sun.jdmk" />
        <exclude org="com.sun.jmx" />
        <exclude org="javax.jms" />
    </dependencies>
</ivy-module>

Switching around the dependency tags will have no effect now, because the dependency resolution is explicit.

  • Log4j and its dependencies are associated with the log4j_deps configuration
  • commons dependencies are placed onto the commons_deps configuration.

Upvotes: 4

Related Questions