Hi guys,

Having some "fun" issues with classloading these days.

I have a task (HibernateTool) that is used like this:

<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask">
      <classpath path="[necessary hibernate libs]">
    </taskdef>


<target name="exportddl" depends="compiletest" description="Export the DDL to caveatemptor.ddl and DB">
        <hibernatetool destdir="${build.dir}">
            <classpath path="etc;${build.dir}/classes"/>
<annotationconfiguration configurationfile="${classes.dir}/hibernate.cfg.xml"/> <hbm2ddl export="false" console="false" drop="false" create="true" outputfilename="caveatemptor.ddl" delimiter=";"/>
        </hibernatetool>
        </target>


Notice that the classpath of the taskdef and hibernatetool have no overlaps.

Until today I had the following code in the HibernateToolTask for creating the classloader:

AntClassLoader loader = getProject().createClassLoader(classPath);
loader.setParent(getProject().getCoreLoader());
loader.setThreadContextLoader();

But when I run this stuff with the task above I get ClassNotFoundErrors for annotations defined in hibernate.

This occurs because with the above classloader setup I effectively goes around the <taskdef> classpath - it will instead first look in the parent of the AntClassLoader I created and this will be the system classloader which
of course know nothing about the hibernate specific classloaders.

Know my current work around for this is to do:

AntClassLoader loader = getProject().createClassLoader(classPath);
loader.setParent(this.getClass().getClassLoader()); <-- this is the HibernateToolTask instance
loader.setThreadContextLoader();

This will setup the right classloading sequence.

But i'm just curious of why this does not seem to be the default way of doing things in the existing ant tasks ?

e.g. in LoadProperties is:
           ClassLoader cL = (classpath != null)
                ? getProject().createClassLoader(classpath)
                : LoadProperties.class.getClassLoader();

which for me says "ignore LoadProperties own classloader if i have a <classpath>"

and most other places they *only* uses the core task loader which for me seems kinda strange (as it can give funny
sideeffects if not all classes used by the <taskdef> isn't loaded yet)

So, am I missing some crucial insight or is it just "random" how the current ant tasks setup their classloaders :) ?

Anyone which can think up any bad things with the classloader setup I did here ?

/max





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to