Ivy cannot download dependencies of artifact located in a local Maven repostiory
Asked Answered
I

3

0

I have an artifact A installed in a local Maven repository.

Artifact A has a number of dependencies - properly specified in its pom.

If I set A as a dependency in a Maven project everything is ok - both A and its dependencies are correctly downloaded. This tells me that A is properly installed in the local Maven repo, and that its dependencies have been properly specified.

I also have a Ant/Ivy project. I have configured ivysettings.xml in the following way (following advice taken from another answer):

<ivysettings>
    <settings defaultResolver="default"/>
    <property name="m2-pattern" value="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]"     override="false" />
    <resolvers>
        <chain name="default">
            <filesystem name="local-maven2" m2compatible="true" >
                <artifact pattern="${m2-pattern}"/>
                <ivy pattern="${m2-pattern}"/>
            </filesystem>
            <ibiblio name="central" m2compatible="true"/>
        </chain>
    </resolvers>
</ivysettings>

With this configuration, Ivy correctly downloads A, but not its dependencies (seems to completely ignore its pom file).

How should I have to change my setup in such a way dependencies as well will be downloaded?

Insurance answered 13/1, 2016 at 12:0 Comment(0)
I
0

Although Mark O'Connor answer is a proper answer and a reasonable way to solve the problem, I managed to find a different solution which implies imo a lesser overhead in terms of setup.

So, I converted the POM of artifact A to an Ivy file - via the Ant task ivy:convertpom. Note that, contrary to the POM standard, the Ivy file should be named as follows: ivy-<your lib revision>.xml.

Then, I just configured a local Ivy repository pointing to the folder where the artifact A and its Ivy file are located, such as:

<ivysettings>
    <property name="my-local-ivy-dependencies-jars.repository" value="${user.dir}\..\my-local-ivy-dependencies-jars/lib"/>
    <property name="my-local-ivy-dependencies-jars.pattern" value="${my-local-ivy-dependencies-jars.repository}/[organisation]/jars/[artifact]-[    revision].[ext]"/>
    <settings defaultResolver="default"/>
    <resolvers>
        <chain name="default">
            <filesystem name="my-local-ivy-dependencies-jars">
                <ivy pattern="${my-local-ivy-dependencies-jars.pattern}" />
                <artifact pattern="${my-local-ivy-dependencies-jars.pattern}" />
            </filesystem>
            <ibiblio name="central" m2compatible="true"/>
        </chain>
    </resolvers>
</ivysettings>
Insurance answered 15/1, 2016 at 6:32 Comment(0)
E
0

Maven and ivy repositories have different formats. Simplistically put Maven uses POM files, whereas ivy uses ivy files.

The good news is that ivy has a special ibiblio resolver which is designed to understand the format of a Maven respository. The bad news is that it does assume such a repository is running remotely, for example using software like Nexus, Artifactory or Achiva.

For example:

<ivysettings>
    <settings defaultResolver="repos" />
    <resolvers>
        <chain name="repos">
            <ibiblio name="central" m2compatible="true"/>   
            <ibiblio name="my-releases" m2compatible="true" root="https://myhost/releases"/>   
        </chain>
    </resolvers>
</ivysettings>

Demonstrates how to pull dependencies from both Maven central and a Maven repository running locally

In conclusion running a Maven repository locally is not hard and the very best way to share artifacts between all kinds of build technologies: Maven, ANT/ivy, Gradle, SBT, etc.

Erg answered 13/1, 2016 at 19:9 Comment(0)
I
0

Although Mark O'Connor answer is a proper answer and a reasonable way to solve the problem, I managed to find a different solution which implies imo a lesser overhead in terms of setup.

So, I converted the POM of artifact A to an Ivy file - via the Ant task ivy:convertpom. Note that, contrary to the POM standard, the Ivy file should be named as follows: ivy-<your lib revision>.xml.

Then, I just configured a local Ivy repository pointing to the folder where the artifact A and its Ivy file are located, such as:

<ivysettings>
    <property name="my-local-ivy-dependencies-jars.repository" value="${user.dir}\..\my-local-ivy-dependencies-jars/lib"/>
    <property name="my-local-ivy-dependencies-jars.pattern" value="${my-local-ivy-dependencies-jars.repository}/[organisation]/jars/[artifact]-[    revision].[ext]"/>
    <settings defaultResolver="default"/>
    <resolvers>
        <chain name="default">
            <filesystem name="my-local-ivy-dependencies-jars">
                <ivy pattern="${my-local-ivy-dependencies-jars.pattern}" />
                <artifact pattern="${my-local-ivy-dependencies-jars.pattern}" />
            </filesystem>
            <ibiblio name="central" m2compatible="true"/>
        </chain>
    </resolvers>
</ivysettings>
Insurance answered 15/1, 2016 at 6:32 Comment(0)
B
0

To complement on Mark O'Connor's answer, you actually can use a local URL with the file:// scheme. The following works for me on Windows (note the triple slash after the scheme):

<ivysettings>
    <settings defaultResolver="local-maven" />
    <resolvers>
        <ibiblio name="local-maven" m2compatible="true" 
            root="file:///c:/path/to/maven/repo"
            pattern="[orgPath]/[module]/[revision]/[artifact]-[revision].[type]"/>
    </resolvers>
</ivysettings>

My use of this was retrieving android sdk dependencies in an ant build with ivy.

Bergsonism answered 29/9, 2016 at 12:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.