Hi, Thanks for your response. Are you suggesting: 1) if I satisfy the prerequisite, then I won't need my suggested patch, or 2) my patch will only work if the prerequisite is satisfied? Assuming 1), I tried this, but when I didn't explicitly load ivysettings, a default was loaded instead and the build failed. Here's my subant target for the example multi-project/build.xml: > description="compile, jar and publish all projects in the > right order"> > > > > > > Here's the Ivy taskdef: > > > > uri="antlib:org.apache.ivy.ant" > loaderRef="ivyLoader" > classpath="${ivy.jar.file}"/> > > and here's the build output, notice the loading of default settings in new-ivy-version: > [multi-project]$ ant publish-all > Buildfile: build.xml > > load-ivy: > [echo] Loading Ivy ... > > buildlist: > [ivy:buildlist] :: Ivy 2.0.0-rc1 - 20080916082609 :: > http://ant.apache.org/ivy/ :: > :: loading settings :: file = > /Volumes/Users/derek/eclipse/Sigil/bld-ivy/test/multi-project/common/ivysettings.xml > > publish-all: > > clean-build: > [delete] Deleting directory > /Volumes/Users/derek/eclipse/Sigil/bld-ivy/test/multi-project/projects/version/build > > load-ivy: > > ivy-new-version: > No ivy:settings found for the default reference 'ivy.instance'. A > default instance will be used > no settings file found, using default... > :: loading settings :: url = > jar:file:/opt/apache-ivy-2.0.0-rc1/ivy-2.0.0-rc1.jar!/org/apache/ivy/core/settings/ivysettings.xml > > version: > [mkdir] Created dir: > /Volumes/Users/derek/eclipse/Sigil/bld-ivy/test/multi-project/projects/version/build/classes I therefore had to change the load-ivy target to always define ivysettings: which is why I concluded that a change to the ivysettings/classpath command was needed. Thanks, Derek Gilles Scokart wrote: > There will be a prerequisite for that to work : You must be sure that > that ivy itself is not loaded in two ClassLoader. For that, your > taskdef for ivy should itself use a loaderRef, and the subant must > have the right options that make the id shared accross the projects. > > And if that prerequisite is valid, in most case you can arrange your > buildscript in order to have the ivysettings defined only once. > > > > 2008/10/16 Derek Baum : > >> Hi, >> >> I have a custom Ivy resolver that keeps a static cache because it is >> time-consuming to initialise. >> >> However, this cache doesn't work in a multi-project build, because the >> ivysettings/classpath command is creating a new URLClassLoader for each >> subant iteration, so all static class fields are reset. >> >> >> >> >> >> >> >> ... >> >> >> >> >> I'm building multiple projects, using ivy:buildlist and subant, as in the >> Ivy multi-project example. >> >> Each iteration of subant, causes IvySettings to reload. >> IvySettings.classloader is thus null and so a new URLClassLoader is created. >> >> I temporarily worked around this by loading my plugin at the same time as >> Ivy (i.e. not using settings/classpath), but I'd really like the >> setting/classpath method to work too. >> >> One possible solution would be to add a "loaderRef" attribute to >> settings/classpath, similar to the Ant taskdef/typedef tasks, to make it use >> the same ClassLoader. >> >> Alternatively, IvySettings could simply be changed to only create a new >> URLClassLoader if the list of URLs has changed. I attach a simple patch to >> IvySettings.java that does this and seems to work OK. >> >> If this is valid and useful, let me know and I'll raise it in Jira. >> >> Thanks, >> >> Derek >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> Index: src/java/org/apache/ivy/core/settings/IvySettings.java >> =================================================================== >> --- src/java/org/apache/ivy/core/settings/IvySettings.java (revision >> 705243) >> +++ src/java/org/apache/ivy/core/settings/IvySettings.java (working >> copy) >> @@ -644,13 +644,19 @@ >> } >> } >> >> + private static Map loaderCache = new HashMap(); >> + >> private ClassLoader getClassLoader() { >> if (classloader == null) { >> if (classpathURLs.isEmpty()) { >> classloader = Ivy.class.getClassLoader(); >> } else { >> - classloader = new URLClassLoader((URL[]) classpathURLs >> + classloader = (ClassLoader) loaderCache.get(classpathURLs); >> + if (classloader == null) { >> + classloader = new URLClassLoader((URL[]) classpathURLs >> .toArray(new URL[classpathURLs.size()]), >> Ivy.class.getClassLoader()); >> + loaderCache.put(classpathURLs, classloader); >> + } >> } >> } >> return classloader; >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org >> For additional commands, e-mail: dev-help@ant.apache.org >> >> > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org For additional commands, e-mail: dev-help@ant.apache.org