ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Peter Reilly" <>
Subject Re: ant and classloading
Date Mon, 16 Oct 2006 09:20:15 GMT
On 10/16/06, Jacob Kjome <> wrote:
> I'm not sure this is 100% an Ant question, but it is within the context of Ant.
> In my Ant task, I'm loading up a class using Class.forName() and pass
> in a classloader that I would have expected to be assigned as the
> classloader for the class.  That doesn't seem to be the case.  Here's
> what I'm doing..
> AntClassLoader customLoader = new
> AntClassLoader(getClass().getClassLoader(), true);
> customLoader.setClassPath(getResourcePath());
> Class clazz = Class.forName(clazzName, true, customLoader);
> System.out.println(customLoader.getResource("org/myorganization/resources/my.dtd"));
> System.out.println(clazz.getClassLoader().getResource("org/myorganization/resources/my.dtd"));
> The DTD resource is found in the first case using the custom
> classloader where the user configured the resourcePath attribute of
> the task, but in the second case when I use the classloader of the
> class that I just loaded by passing in the custom classloader I just
> get "null".  The point of this is that the class I am loading needs
> to look up user-defined resources on the classpath.  With the
> System.out lines, I am just testing what my loaded class needs to do
> further down the line.
> Shouldn't the classloader of the class I just loaded be a reference
> to that which I passed into Class.forName()?

No, Java uses a delegated classloader model. Normally, classloaders
search up the hierarchy, starting at the base classloader to load
a  class. The reason for this is that classes are not the same unless
they are loaded from the same classloader. To take a simple case
one would want java.lang.Object to be the same no matter how
it is loaded.

> This is probably more
> of a general classloading question than an Ant question, but I'm
> guessing others have had to deal with that here.  I must be making a
> bad assumption, but it seems like something like this should be possible.
> My only workaround right now is to add the extra classpath
> information to the Task definition classpath.  However, that is not
> intuitive for task users and a pretty ugly hack.  Is there any way to
> do this?  I've run into and solved many classloading issues in the
> past, but I've never had to deal with this specifically.  I have to
> imagine someone has solved this problem already.  Care to share the solution?
> Jake
> ---------------------------------------------------------------------
> To unsubscribe, e-mail:
> For additional commands, e-mail:

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message