diff --git a/proposal/sandbox/embed/ProjectHelperImpl2.java b/proposal/sandbox/embed/ProjectHelperImpl2.java index 1b2755c87..b72fe3f92 100644 --- a/proposal/sandbox/embed/ProjectHelperImpl2.java +++ b/proposal/sandbox/embed/ProjectHelperImpl2.java @@ -97,6 +97,39 @@ public class ProjectHelperImpl2 extends ProjectHelper { */ private static SAXParserFactory parserFactory = null; + /** Will prepare the class loader to allow dynamic modifications + of the classpath. Optional tasks are loaded in a different loader. + */ + public void initClassLoader(Project project) { + try { + // reverse loader + AntClassLoader acl=new AntClassLoader( this.getClass().getClassLoader(), true ); + acl.addLoaderPackageRoot( "org.apache.tools.ant.taskdefs.optional"); + + // XXX find the classpath + String antHome=project.getProperty( "ant.home" ); + File optionalJar=new File( antHome + "/lib/optional.jar" ); + System.out.println("Optional.jar = " +optionalJar.getAbsolutePath()); + acl.addPathElement(optionalJar.getAbsolutePath() ); + + // reload all optional tasks in this loader. + Hashtable tasks=project.getTaskDefinitions(); + Enumeration keys=tasks.keys(); + while( keys.hasMoreElements() ) { + String n=(String)keys.nextElement(); + Class c=(Class)tasks.get(n); + if( ! c.getName().startsWith( "org.apache.tools.ant.taskdefs.optional" )) + continue; + // System.out.println("Reloading " + n + " " + c + " " + c.getClassLoader() ); + c=acl.loadClass( c.getName() ); + tasks.put( n, c ); + // System.out.println("Loaded " + n + " " + c.getClassLoader() ); + } + } catch( Exception ex ) { + ex.printStackTrace(); + } + } + /** * Parses the project file, configuring the project as it goes. * @@ -104,6 +137,9 @@ public class ProjectHelperImpl2 extends ProjectHelper { * be read */ public void parse(Project project, Object source) throws BuildException { + // re-init class loader for optional.jar + initClassLoader( project ); + AntXmlContext context=new AntXmlContext(); if(source instanceof File) { context.buildFile=(File)source; diff --git a/proposal/sandbox/embed/ant-sax2.jar b/proposal/sandbox/embed/ant-sax2.jar index 8aa825610..780565122 100644 Binary files a/proposal/sandbox/embed/ant-sax2.jar and b/proposal/sandbox/embed/ant-sax2.jar differ diff --git a/proposal/sandbox/embed/build.xml b/proposal/sandbox/embed/build.xml index 4df8bef51..3fcebe6a8 100644 --- a/proposal/sandbox/embed/build.xml +++ b/proposal/sandbox/embed/build.xml @@ -2,13 +2,15 @@ - + - + + @@ -27,6 +29,8 @@ + +