@@ -0,0 +1,3143 @@
+package python.testdaemon;%0A%0Aimport java.io.IOException;%0Aimport java.io.InputStream;%0Aimport java.net.URL;%0Aimport java.nio.ByteBuffer;%0Aimport java.security.SecureClassLoader;%0Aimport java.util.Enumeration;%0Aimport java.util.Vector;%0A%0A// http://www.source-code.biz/snippets/java/12.htm%0A/**%0A* A class loader that combines multiple class loaders into one.%3Cbr%3E%0A* The classes loaded by this class loader are associated with this class loader,%0A* i.e. Class.getClassLoader() points to this class loader.%0A* %3Cp%3E%0A* Author Christian d'Heureuse, Inventec Informatik AG, Zurich, Switzerland, www.source-code.biz%3Cbr%3E%0A* License: LGPL, http://www.gnu.org/licenses/lgpl.html%3Cbr%3E%0A* Please contact the author if you need another license.%0A*/%0Apublic class JoinClassLoader extends ClassLoader %7B%0A%0Aprivate ClassLoader%5B%5D delegateClassLoaders;%0A%0Apublic JoinClassLoader (ClassLoader parent, ClassLoader... delegateClassLoaders) %7B%0A   super (parent);%0A   this.delegateClassLoaders = delegateClassLoaders; %7D%0A%0Aprotected Class%3C?%3E findClass (String name) throws ClassNotFoundException %7B%0A   // It would be easier to call the loadClass() methods of the delegateClassLoaders%0A   // here, but we have to load the class from the byte code ourselves, because we%0A   // need it to be associated with our class loader.%0A   String path = name.replace('.', '/') + %22.class%22;%0A   URL url = findResource(path);%0A   if (url == null) %7B%0A      throw new ClassNotFoundException (name); %7D%0A   ByteBuffer byteCode;%0A   try %7B%0A      byteCode = loadResource(url); %7D%0A    catch (IOException e) %7B%0A      throw new ClassNotFoundException (name, e); %7D%0A   return defineClass(name, byteCode, null); %7D%0A%0Aprivate ByteBuffer loadResource (URL url) throws IOException %7B%0A   InputStream stream = null;%0A   try %7B%0A      stream = url.openStream();%0A      int initialBufferCapacity = Math.min(0x40000, stream.available() + 1);%0A      if (initialBufferCapacity %3C= 2)%0A         initialBufferCapacity = 0x10000;%0A       else%0A         initialBufferCapacity = Math.max(initialBufferCapacity, 0x200);%0A      ByteBuffer buf = ByteBuffer.allocate(initialBufferCapacity);%0A      while (true) %7B%0A         if (!buf.hasRemaining()) %7B%0A            ByteBuffer newBuf = ByteBuffer.allocate(2*buf.capacity());%0A            buf.flip();%0A            newBuf.put (buf);%0A            buf = newBuf; %7D%0A         int len = stream.read(buf.array(), buf.position(), buf.remaining());%0A         if (len %3C= 0) break;%0A         buf.position (buf.position()+len); %7D%0A      buf.flip();%0A      return buf; %7D%0A    finally %7B%0A      if (stream != null) stream.close(); %7D%7D%0A%0Aprotected URL findResource (String name) %7B%0A   for (ClassLoader delegate : delegateClassLoaders) %7B%0A      URL resource = delegate.getResource(name);%0A      if (resource != null) return resource; %7D%0A   return null; %7D%0A%0Aprotected Enumeration%3CURL%3E findResources (String name) throws IOException %7B%0A   Vector%3CURL%3E vector = new Vector%3CURL%3E();%0A   for (ClassLoader delegate : delegateClassLoaders) %7B%0A      Enumeration%3CURL%3E enumeration = delegate.getResources(name);%0A      while (enumeration.hasMoreElements()) %7B%0A         vector.add (enumeration.nextElement()); %7D%7D%0A   return vector.elements(); %7D%0A%0A%7D // end class JoinClassLoader

Add JoinClassLoader to merge the voc and runtime loaders