ant-ivy-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Nicolas Lalevée <>
Subject Re: Using ivy:retrieve sync="true" deletes my non-ivy managed jars
Date Fri, 30 Sep 2011 22:04:31 GMT

Le 30 sept. 2011 à 20:38, Michael Lake a écrit :

> Obviously, getting things working "out-of-the-box" for the most common scenarios will
help lower the barrier to adoption for Ivy. Perhaps by explaining my use-case, it would help
paint a better picture of the path of a new user.
> I'm dabbling with Ivy as a light-weight method to grab snapshots of a shared library
which is built with maven2 on our continuous integration server and published to our internal
> The library is a jar that we want to use in our android projects and we're working towards
making it open source. Since Android already creates an Ant build configuration, it seems
to make sense to use Ivy as a method of pulling releases/snapshots from our repo for our shared
library with minimal intrusion into existing projects. This is attractive compared with making
our Android projects into Maven projects which just requires too much overhead - not only
for us as an internal company, but also for end users who may not be so savvy with dependency
> From a new-user perspective, it seemed to me that Ivy should do a quick scan of the output
directory and use the output pattern [artifact]-[revision].[ext] as a way of determining if
there already existing artifacts copied to this dir and if there are, see if we need to delete
them because we'll be bringing in a different version of the same artifact.
> Here's my current workaround which is a bit of a hack..
>       <delete>
>            <fileset dir="${ivy.lib.dir}" includes="oak-library*"/>
>        </delete>
>        <ivy:retrieve/>
> This will go in an imported ant build file which is to be copied into any projects which
use the library - works, but not ideal.
> I'd rather see Ivy do what I want as a new user right out of the box (or at least with
a simple flag). Sure, there's always the possibility that the Ivy output pattern gets changed
and some jars might get left laying around, but I think that's a small price to pay to give
new users a little more momentum with Ivy.

Having jar laying around in a classpath is not a good idea. Even without that we can have
some "jar hell". I wouldn't recommend a such practice.

And about implementing what you're suggesting, I could not answer better than as Kirby already

If I may suggest another solution: put your adhoc jars in an Ivy repository so Ivy will manage
them as regular dependencies.
By this solution, I don't mean having a file server somewhere, you can do it with a simple
folder next to your project with a minimalist pattern. In your ivysettings you could put something
<filesystem name="adhocjars">
	<artifact pattern="${adhocjars.dir}/[artifact]-[revision].[ext]" />

But I don't know your use case well, maybe you use Ivy mainly as an automatic downloader rather
than a dependency manager, the above solution maybe overkill.


> I'm sure I'm only scratching the surface of Ivy capability - I'm by no means an expert
and not looking to be one. 
> But…I imagine once we've got a few projects with these ivy.xml files laying around,
rather than hunting down the latest version of commons-lang from apache's website, we'll be
using ivy.xml to bring in new libraries. And by then we'll be hooked.
> Michael Lake
> Senior Software Developer
> WillowTree Apps
> O 434-326-4341 | M 434.202.9223
> On Sep 30, 2011, at 9:39 AM, Kirby Files wrote:
>> Michael Lake wrote on 09/30/2011 09:11 AM:
>>> let's say I modify my ivy.xml to use a different version of oak, say version
>> [...]
>>> $ ant init-ivy-sync # here's it's doing<ivy:retrieve sync="true" />
>>> $ ls -1 libs/ # as you can see, everything else gets deleted
>>> oak-library-1.0.4-javadoc.jar
>>> oak-library-1.0.4-sources.jar
>>> oak-library-1.0.4.jar
>> Yes, that's the way sync=true works. You're telling Ivy that you'd like it to manage
the jars in the destination directory.
>>> ideally, I'd like to just have the oak-library*.jars change and everything else
be left alone (and no, I don't want to stick my other libs in the repository)
>>> how can I accomplish this?
>> Do you have a proposal as to how you'd like Ivy to know which jars to remove, if
you only wanted jars previously retrieved by Ivy deleted? Consider the possible modifications
you may have made to ivy.xml or ivysettings.xml:
>> * change a module revision
>> * change the source repo for the module
>> * change the artifacts retrieved for a module
>> * remove one or more modules from ivy.xml
>> Since the old copy of the ivy.xml isn't available for a diff, where would you keep
the data on what jars "belong" to ivy? Keep a file which stores all artifacts downloaded,
with filenames, hashes, etc.? Would that file survive a cacheclean? Or would a cacheclean
cause ivy to forget what had been previously downloaded? What if a jar already exists with
the same name as an artifact Ivy would retrieve, but a different hash? Or a jar with the same
module name but no/different revision than ivy would retrieve?
>> The current behavior is straightforward to explain and implement, which is a virtue.
That said, I imagine the Ivy devs would be willing to consider a patch to a different or additional
mode of operation, if you thought through the ramifications, not limited to the ones listed
>> Thanks,
>> ---
>> Kirby Files
>> Software Architect
>> Masergy Communications

View raw message