ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "James Abley" <>
Subject Re: Looking for help with context classloader
Date Fri, 25 Jan 2008 15:01:44 GMT
On 23/01/2008, Toomey, Kevin H (ATS, IT) <> wrote:
> I'm writing a web application for among things, managing the building and deploying of
applications, and I'm using Ant (1.7.0) as the engine for those pieces. The basic flow is:
> Project p = new Project();
> p.init();
> p.setUserProperty("ant.file", "common.xml")
> ProjectHelper2 ph = new ProjectHelper2
> ph.parse(p, "common.xml");
> p.executeTarget("myTarget");
> The common.xml file contains <taskdef> definitions for PVCS tasks I wrote to promote,
label, get, etc. Those tasks get executed in targets found in common.xml. Those classes are
in a jar file called myPVCS.jar.
> During development, I executed my code from a jar file, with any supporting jar files
in my system class path (java -classpath myApp.jar;myPVCS.jar;ant.jar;log4j.jar;mail.jar....
myApp.myClass). Everything works fine.
> I then create my war file and place all the required jar files in the web-inf/lib folder.
The application fails with a ClassNotFoundException during the call to the ProjectHelper2
parse method. It cannot find the class defined in my <taskdef> definition in common.xml.
That class is in myPVCS.jar, which is in the web-inf/lib folder of my war file. If I update
the snippet above with Class c = Class.forName("mypvcstask"), it finds it, so I know my war
file structure is sound.
> From looking at Ant source code, javadoc, and postings I've found, it looks like PropertyHelper2
uses a thread context classloader which uses the system classloader (the one that started
my weblogic instance to which my web app is deployed) as a parent. As a test, I put myPVCS.jar
in the weblogic classpath and it did find the class. Naturally, I don't want to go that route
because it breaks the whole "fully contained application in a war file" model I'm shooting
> I see references to LoaderUtils, AntClassLoader, and other things, but I can't figure
out how to use them in my case.
> Since the class shown above finds classes in my web-inf/lib folder, I believe what I
want is the ability to do something like:
> ProjectHelper2 ph2 = new ProjectHelper2();
> ph2.setContextClassLoader(this.getClass().getClassLoader());
> ph2.parse(p, "common.xml");
> What can I do, or am I just trying to do something that can't be done (in an efficient
manner), and I need to rethink my approach.
> Thanks,
> Kevin
> *************************************************************************
> This communication, including attachments, is
> for the exclusive use of addressee and may contain proprietary,
> confidential and/or privileged information.  If you are not the intended
> recipient, any use, copying, disclosure, dissemination or distribution is
> strictly prohibited.  If you are not the intended recipient, please notify
> the sender immediately by return e-mail, delete this communication and
> destroy all copies.
> *************************************************************************

Classloader fiddling is always fun, a bit like playing with shotguns.
Probably not advisable unless you really know what you're doing. That
said, if you have to mess with the classloader, have you tried setting
the context classloader to a suitable classloader subclass which is
aware of WEB-INF/lib and WEB-INF/classes, and then restoring the
original classloader when you're done?



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

View raw message