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 @@
+
+