zharvey wrote on 09/15/2011 09:29 AM:

Hi Kirby,

Thanks for getting back to me so quickly.

Here's my settings file (ivy-settings.xml):
===============================
<ivysettings>
        <properties file="ivy-settings.properties"/>
     <settings defaultResolver="defResolver"/>
     <latest-strategies>
        <latest-lexico/>
     </latest-strategies>
     <resolvers>
         <chain name="defResolver" returnFirst="true">
                <url name="jarServer">
                                <ivy
pattern="http://my-server.net/module_descriptors/[organisation]/[module]-[revision]-ivy.xml"/>
                                <artifact
pattern="http://my-server.net/artifacts/[organisation]/[artifact]-[revision].[ext]"/>
                </url>
         </chain>
     </resolvers>

You only have url resolvers defined here. You cannot really publish to those. You need to publish to a resolver you can write to: filesystem, sftp, webdav via common-vfs, etc.

     <modules>
        <module organisation="myOrg" name="*" resolver="defResolver"/>
     </modules>

If you have a defaultResolver defined, as you do above, you don't need to do explicit module mapping to a resolver.


     <publications defaultconf="publish">
                <artifact name="MyModule" />
        </publications>

You're going to publish your artifacts to a configuration named publish, so any modules depending on MyModule will need to have a confMapping of compile->publish. Is that what you want? I typically publish artifacts to configurations based upon how they will be used by the consuming project. So jars needed for running an app will be in the "runtime" configuration, while jars only needed for building will be published to the "compile" configuration, etc. I also defined javadocs and sources configurations.


        <!-- Ivy "publish" task; publish the distribution to SVN for downstream
projects -->
        <target name="publish">
                <ivy:publish organisation="myOrg" module="MyModule" 
resolver="defResolver"
revision="1.0">
                        <artifacts pattern="dist/[artifact]-[revision].[ext]"/>
                </ivy:publish>
        </target>
</project>

So there's your problem. The publish target needs to depend on the resolve target, which needs to depend on the settings target.

The settings task should only ever be run once during an ant build, so I guard against executing twice (say resolve->settings and deliver->settings are both executed in the same build):

    <target name="ivysettings" unless="ivysettings.completed">
        <property name="ivysettings.completed" value="true" />
        <ivy:settings id="ivy.instance"
                      url="${ivy.settings.url}"
        />
    </target>


You'll also want to publish to a resolver to which you can write. I generally would not add the artifacts child element (use publications in ivy.xml instead); use artifactspattern to define where to find the jars specified in <publications>. Unless you have multiple modules per buildfile, I wouldn't use the org or module attributes, either. You should probably specify a pubrevision and status.

Here's an example from one of my projects:

    <target name="publish_only"
            depends="resolve"
description="--&gt; publish this project in the prod ivy repository">
        <property name="revision" value="${version}" />
<ivy:publish artifactspattern="${dist.dir}/[type]s/[artifact]-[revision].[ext]"
                     resolver="masrep_sftp"
                     pubrevision="${revision}"
                     status="release"
                     overwrite="false"
                     update="true" />
<echo message="project ${ant.project.name} released with version ${revision}" />
    </target>

Also,
Thanks,
---
Kirby Files
Software Architect
Masergy Communications
kfi...@masergy.com

Reply via email to