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 for.

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.
*************************************************************************

Reply via email to