[ http://issues.apache.org/jira/browse/JAMES-418?page=all ]
     
Stefano Bagnara resolved JAMES-418:
-----------------------------------

    Fix Version: 2.3.0
     Resolution: Fixed

This should be fixed in the last trunk.
Upgraded phoenix to 4.1trunk (4.2 ?) and removed the james specific code to 
change the classloaders for mailet/matchers.
Make use of Thread.currentThread().getContextClassLoader().loadClass() to load 
matcher/mailet classes!


> Loader uses wrong method to obtain class loader/doesn't set context class 
> loader
> --------------------------------------------------------------------------------
>
>          Key: JAMES-418
>          URL: http://issues.apache.org/jira/browse/JAMES-418
>      Project: James
>         Type: Bug
>   Components: James Core
>     Versions: 2.2.0
>     Reporter: Ben Lindahl
>     Assignee: Stefano Bagnara
>      Fix For: 2.3.0
>  Attachments: cornerstone-datasources-impl-2.1.jar, phoenix-trunk.zip
>
> I had difficulty loading resources from my classes directory.  In reviewing 
> the Loader source code, I see two problems:
> 1) It uses this.class.getClassLoader(), rather than the preferred/standard 
> Thread.currentThread.getContextClassLoader().  This is not a problem right 
> now, as the Apache James developers have control over the entire application, 
> but could become a difficult bug to track down in the future.  In addition, 
> as soon as you start adding multiple class loaders, chaining class loaders 
> with parents becomes impossible (see next point) because it sets the same 
> class loader as multiple parents.  In the source code, all instances of 
> this.getClass().getClassLoader() (or whatever.getClass().getClassLoader()) 
> should be replaced by Thread.currentThread().getContextClassLoader()
> 2) The greater problem is that it does not call 
> Thread.currentThread().setContextClassLoader(classLoader).  This means that 
> any code that uses the standard method 
> Thread.currentThread().getContextClassLoader() (as my code does) will not get 
> the correct class loader, and thus will not be able to load the appropriate 
> resources.  In fact, I was getting the primary class loader, which only loads 
> the Phoenix Jar.  I had to add into my code the following (the class loader's 
> parent is already set):
> Thread.currentThread().setContextClassLoader(MyClass.class.getClassLoader());
> By the nature of Java class loaders, it is expected that the thread's Context 
> ClassLoader is always kept current, and that any new class loaders are added 
> to the chain.  I think that this change should be made in the Apache James 
> source code.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to