[ http://issues.apache.org/jira/browse/JAMES-418?page=all ] Stefano Bagnara reopened JAMES-418: -----------------------------------
test, the bug is "resolved" but still is in my unresolved view.. something weird in jira... let's try reopen and close it again! > 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]
