ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Peter Reilly" <peter.kitt.rei...@gmail.com>
Subject Re: ant and classloading
Date Mon, 16 Oct 2006 09:20:15 GMT
On 10/16/06, Jacob Kjome <hoju@visi.com> 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: user-unsubscribe@ant.apache.org
> For additional commands, e-mail: user-help@ant.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@ant.apache.org
For additional commands, e-mail: user-help@ant.apache.org


Mime
View raw message