I can apply the patch to the code in jakarta-commons-sandbox as well.

I would assume that a dependency on JDK 1.2 is not a problem.  Someone 
will speak up if it is not.

Scott

Colin Sampaleanu wrote:

> There was never any reply to this message (below) I sent a few months ago
> about a problem with the method used by the Digestor for class loading.
> 
> In a number of places, it uses the old style
>       class.forName(name);
> instead of the proper
>       Thread.getCurrentThread.getContextClassLoader.loadClass(name);
> 
> The second form is _much_ preferred to the first, because the first will
> potentially fail in any situation where there are multiple classloaders (one
> owning the other), and the Digester is used in code loaded by both
> classloaders (please see my original message for more details).
> 
> This kind of situation is very common any time you have something like a
> server (web, etc.) with containers in it, each container having its own
> classloader associated with it in order to handle code visibility and
> versioning. Using the digester in this situation is not possible without
> modifying the code to use the second form.
> 
> I am quite willing and able to upload patches to 4 digester files to fix
> this, assuming they will be checked in by somebody. The only implication is
> that the code will no longer run under JDK 1.1, but Struts already needs 1.2
> in any case...
> 
> For more details on classloading issues in Java, here are a couple of
> excellent white papers:
> Understanclind Class.forName();
> http://www.develop.com/downloads/DynLoad.zip
> Exploiting the Java Virtual Machine:
> http://www.develop.com/downloads/DevWPJav.pdf
> 
> 
> 
> 
>> -----Original Message-----
>> From: Colin Sampaleanu [mailto:[EMAIL PROTECTED]]
>> Sent: February 22, 2001 10:06 PM
>> To: '[EMAIL PROTECTED]'
>> Subject: ClassLoader used in Digester
>> 
>> 
>> We are currently using the digester in a server we build that 
>> uses custom
>> classloaders for some containers within it, which load custom apps.
>> 
>> We use the Digester in the server itself, and some of the 
>> apps being loaded
>> in the containers also want to use the Digester. The problem 
>> is that when an
>> app creates a Digester instance, it is created by the parent (system)
>> classloader that loaded the server, since the server had 
>> already used the
>> Digester and that classloader knows about it. When the 
>> Digester then does a
>> Class.forName in one of its rules to create an object, it 
>> knows nothing
>> about the container's ClassLoader and the classes within it. 
>> The class is
>> only withing the app, and so can't be found.
>> 
>> Is there any downside to changing the Digester to always use:
>>   Thread.getCurrentThread.getContextClassLoader.loadClass(name);
>> instead of 
>>   class.forName(name);
>> 
>> The code would no longer work in JDK 1.1, but that is already 
>> the case...
>> 


Reply via email to