Publish a Maven artifact to a local Ivy repository, recursively with its dependencies
Asked Answered
C

1

2

I have to mirror a set of dependencies to my company-local Ivy repository.

I currently need to publish Hibernate Spatial 4.0-M1. From my Eclipse project, I can only resolve Ivy dependencies if I enable remote repository <ibiblio name="hibernate-spatial" m2compatible="true" root="http://www.hibernatespatial.org/repository"/> (and exclude a few dependencies from dependencies.xml), which other developers don't have as they retrieve only from LAN.

So I ended up putting the JAR into the publish directory, convert the HS official POM to Ivy using a proper Ant task and I ended up with the following dependencies.xml

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="1.0" xmlns:m="http://ant.apache.org/ivy/maven">
    <info organisation="org.hibernate"
        module="hibernate-spatial"
        revision="4.0-M1"
        status="release"
        publication="20130904175525"
    >
        <description homepage="" />
    </info>
    <configurations>
        <conf name="default" visibility="public" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/>
        <conf name="master" visibility="public" description="contains only the artifact published by this module itself, with no transitive dependencies"/>
        <conf name="compile" visibility="public" description="this is the default scope, used if none is specified. Compile dependencies are available in all classpaths."/>
        <conf name="provided" visibility="public" description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive."/>
        <conf name="runtime" visibility="public" description="this scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath." extends="compile"/>
        <conf name="test" visibility="private" description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." extends="runtime"/>
        <conf name="system" visibility="public" description="this scope is similar to provided except that you have to provide the JAR which contains it explicitly. The artifact is always available and is not looked up in a repository."/>
        <conf name="sources" visibility="public" description="this configuration contains the source artifact of this module, if any."/>
        <conf name="javadoc" visibility="public" description="this configuration contains the javadoc artifact of this module, if any."/>
        <conf name="optional" visibility="public" description="contains all optional dependencies"/>
    </configurations>
    <publications>
        <artifact name="hibernate-spatial" type="jar" ext="jar" conf="compile"/>
    </publications>
    <dependencies>
        <dependency org="jaxen" name="jaxen" rev="1.1" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="junit" name="junit" rev="4.8.2" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="commons-logging" name="commons-logging-api" rev="99.0-does-not-exist" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.6.1" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="postgresql" name="postgresql" rev="8.4-701.jdbc4" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
        <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.6.1" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="javax.validation" name="validation-api" rev="1.0.0.GA" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="dom4j" name="dom4j" rev="1.6.1" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
        <!--<dependency org="org.postgis" name="postgis-jdbc" rev="1.5.3" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>-->
        <dependency org="org.hibernate" name="hibernate-validator" rev="4.2.0.Final" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="org.slf4j" name="slf4j-api" rev="1.6.1" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="commons-dbcp" name="commons-dbcp" rev="1.4" force="true" conf="test->runtime(*),master(*)"/>
        <!--<dependency org="org.jboss.logging" name="jboss-logging" rev="3.1.0.CR2" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>-->
        <dependency org="com.fasterxml" name="classmate" rev="0.5.4" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="commons-logging" name="commons-logging" rev="99.0-does-not-exist" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="org.jboss" name="jandex" rev="1.0.3.Final" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="org.hibernate" name="hibernate-core" rev="4.0.0.Final" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
        <dependency org="org.hibernate" name="hibernate-testing" rev="4.0.0.Final" force="true" conf="test->runtime(*),master(*)"/>
        <dependency org="com.vividsolutions" name="jts" rev="1.12" force="true" conf="compile->compile(*),master(*);runtime->runtime(*)"/>
        <dependency org="com.h2database" name="h2" rev="1.2.145" force="true" conf="test->runtime(*),master(*)"/>
        <!--<dependency org="javassist" name="javassist" rev="3.12.1.GA" force="true" conf="test->runtime(*),master(*)"/>-->
    </dependencies>
</ivy-module>

I run the following Ant task:

<target name="ivy-local-release" depends="ivy-config" description="Locally publish a file">
    <ivy:resolve />
    <ivy:publish artifactspattern="${ivy.install.dir}/publish/[artifact]-[revision].[ext]"  resolver="local" status="release" overwrite="true" />
</target>

and I get the following output:

ivy-config:
[ivy:configure] :: Ivy 2.1.0 - 20090925235825 :: http://ant.apache.org/ivy/ ::
[ivy:configure] :: loading settings :: file = C:\Program Files (x86)\Ivy\ivy-settings.xml
ivy-local-release:
[ivy:resolve] :: resolving dependencies :: org.hibernate#hibernate-spatial;4.0-M1
[ivy:resolve]   confs: [default, master, compile, provided, runtime, test, system, sources, javadoc, optional]
[ivy:resolve]   found postgresql#postgresql;8.4-701.jdbc4 in maven2
[ivy:resolve]   found dom4j#dom4j;1.6.1 in local
[ivy:resolve]   found xml-apis#xml-apis;1.0.b2 in maven2
[ivy:resolve]   found org.hibernate#hibernate-core;4.0.0.Final in maven2
[ivy:resolve]   found commons-collections#commons-collections;3.2.1 in local
[ivy:resolve]   found antlr#antlr;2.7.7 in local
[ivy:resolve]   found org.jboss.spec.javax.transaction#jboss-transaction-api_1.1_spec;1.0.0.Final in local
[ivy:resolve]   found org.hibernate.javax.persistence#hibernate-jpa-2.0-api;1.0.1.Final in maven2
[ivy:resolve]   found org.jboss.logging#jboss-logging;3.1.0.CR2 in maven2

[...]

[ivy:resolve]   ==== jboss: tried
[ivy:resolve]     https://repository.jboss.org/nexus/content/repositories/releases/gnu-getopt/getopt/1.0.13/getopt-1.0.13.pom
[ivy:resolve]     -- artifact gnu-getopt#getopt;1.0.13!getopt.jar:
[ivy:resolve]     https://repository.jboss.org/nexus/content/repositories/releases/gnu-getopt/getopt/1.0.13/getopt-1.0.13.jar
[ivy:resolve]   ==== shared: tried
[ivy:resolve]     R:/repository/gnu-getopt/getopt/1.0.13/ivys/ivy.xml
[ivy:resolve]     -- artifact gnu-getopt#getopt;1.0.13!getopt.jar:
[ivy:resolve]     R:/repository/gnu-getopt/getopt/1.0.13/jars/getopt.jar
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       ::          UNRESOLVED DEPENDENCIES         ::
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve]       :: commons-logging#commons-logging-api;99.0-does-not-exist: not found
[ivy:resolve]       :: commons-logging#commons-logging;99.0-does-not-exist: not found
[ivy:resolve]       :: commons-httpclient#commons-httpclient;3.1-jbossorg-1: not found
[ivy:resolve]       :: org.hornetq#hornetq-core;working@antonioanzivino: not found
[ivy:resolve]       :: org.jboss.netty#netty;working@antonioanzivino: not found
[ivy:resolve]       :: jacorb#jacorb;2.3.1jboss.patch01-brew: not found
[ivy:resolve]       :: jacorb#idl;2.3.1jboss.patch01-brew: not found
[ivy:resolve]       :: org.jboss.logmanager#jboss-logmanager;working@antonioanzivino: not found
[ivy:resolve]       :: org.jboss.integration#jboss-transaction-spi;working@antonioanzivino: not found
[ivy:resolve]       :: org.jboss.spec.javax.ejb#jboss-ejb-api_3.1_spec;working@antonioanzivino: not found
[ivy:resolve]       :: org.jboss.spec.javax.servlet#jboss-servlet-api_3.0_spec;working@antonioanzivino: not found
[ivy:resolve]       :: ${project.parent.groupId}#jboss-logging-generator;1.0.0.Beta6: not found
[ivy:resolve]       :: org.jboss.ws#jbossws-api;1.0.0-SNAPSHOT: not found
[ivy:resolve]       :: gnu-getopt#getopt;1.0.13: not found
[ivy:resolve]       ::::::::::::::::::::::::::::::::::::::::::::::
[ivy:resolve] 
[ivy:resolve] 
[ivy:resolve] :: USE VERBOSE OR DEBUG MESSAGE LEVEL FOR MORE DETAILS

BUILD FAILED

I use the following resolver configuration in my ivy-settings.xml

    <resolvers>
    <filesystem name="shared" >
        <ivy pattern="${ivy.shared.default.root}/${ivy.shared.default.ivy.pattern}" />
        <artifact pattern="${ivy.shared.default.root}/${ivy.shared.default.artifact.pattern}" />
    </filesystem>
    <ibiblio name="maven2" m2compatible="true"/>
    <ibiblio name="geotools" m2compatible="true" root="http://download.osgeo.org/webdav/geotools"/>
    <ibiblio name="hibernate-spatial" m2compatible="true" root="http://www.hibernatespatial.org/repository"/>
    <ibiblio name="jboss" m2compatible="true" root="https://repository.jboss.org/nexus/content/repositories/releases/"/>
    <ibiblio name="mavenjava" m2compatible="true" root="http://download.java.net/maven/2" />
</resolvers>
<resolvers>
    <chain name="default" returnFirst="false">
        <resolver ref="local" />
        <resolver ref="maven2" />
        <resolver ref="geotools" />
        <resolver ref="hibernate-spatial" />
        <resolver ref="jboss" />
        <resolver ref="shared" />

    </chain>
</resolvers>

The strange is that I can resolve all dependencies when I run ivy:resolve on my local project.

I would like to recursively publish dependencies on local Ivy repository when I publish a new artifact. How to do that?

Christal answered 5/9, 2013 at 11:1 Comment(0)
A
-1

Does it have to ivy? A better option for hosting dependencies internally is to setup a Maven repository manager like Nexus. External repositories like Maven Central will then be retrieved from automatically and cached locally.

If you're determined to use ivy I would recommend looking at the ivy install task.

Asseveration answered 6/9, 2013 at 0:40 Comment(2)
Yes, that must be Ivy because the whole company uses Ivy and I don't have control or discussion power over thatBreastwork
@djechelon That's fine, but don't forget that ivy has a ibiblio resolver that is compatible with Maven repoositories. The advantage of using Nexus is that it actively manages your repository, with ivy you'll have to build it yourelf.Janijania

© 2022 - 2024 — McMap. All rights reserved.