So you are saying that webapp developers should ask the following to a Servlet/Filter/Listener destroy function ?
LogFactory.release(getClass().getClassLoader()); "Simon Kitching" <[EMAIL PROTECTED]> skrev i en meddelelse news:[EMAIL PROTECTED] > Hi Adrian, > > On Wed, 2005-07-27 at 20:15 -0400, Adrian Brock wrote: >> On Wed, 2005-07-27 at 19:43, Simon Kitching wrote: >> > I feel that it is simply unacceptable to drop thirdparty libraries that >> > have never expected to be "container extensions" into the container's >> > classpath? >> >> So aren't you just saying don't use commons-logging in infrastructure >> software unless you can isolate that part of the infrastruture >> from sharing any classes with the rest of the server? >> i.e. don't use it an application server like Tomcat/JBoss > > Not at all. I'm saying that any code deployed into the container's > classpath should be container-aware or that the container should be > aware of it or both. > > Tomcat uses commons-logging, and that's fine because Tomcat ensures that > it cleans up commons-logging when an app is undeployed (see > org.apache.catalina.loader.WebappClassLoader). [1] > > If jboss wants to use Hibernate as part of the container, and Hibernate > uses commons-logging then that's fine: but the container needs to take > that into account by ensuring LogFactory.release is called on undeploy. > Yes it would be nice if this wasn't necessary but as I described earlier > neither java nor j2ee provide *any* mechanism for arbitrary code in the > container's classpath to associated resources with a component > ("application context") so commons-logging can't easily do this itself. > > But I think people should *not* expect that they can grab any random > open-source library from the internet, drop it into the container's > classpath and expect things to work properly. Such libraries should go > into the component's WEB-INF/lib unless they are explicitly declared to > be "container extensions". NB: this includes dropping hibernate into the > container classpath of some arbitrary container framework (j2ee or > otherwise). > > Commons-logging only qualifies as a valid "container extension" when the > container ensures that LogFactory.release is called on webapp undeploy. > > One interesting problem with many libraries that use logging is that > they do this: > public class Foo { > private static final Logger log = Logger.getLogger("somecategory"); > } > The problem occurs if the getLogger method uses the TCCL to determine > what Log object to return. In the case of log4j, if the Context > Repository Selector is configured for log4j then this problem occurs. > Commons-logging has the same limitation. > > When such code is in a component's classpath everything is fine. But > when such code is placed into the container's classpath the *first* > component to call it determines what Log object is returned, then when > other components call into that code in the shared classpath the wrong > logger gets used. Again it's back to that static caching issue: using > statics is fine when the class is deployed *via the component* but wrong > when the class is deployed via a shared classloader. > > [1] I noticed another interesting little bit of code in tomcat;s > WebappClassLoader.stop method: > // Clear the classloader reference in common-logging > org.apache.commons.logging.LogFactory.release(this); > // Clear the classloader reference in the VM's bean introspector > java.beans.Introspector.flushCaches(); > The introspector class caches stuff at a global level?? eek! Again this > would be a very nice case for attaching such cached info to a specific > classloader to avoid these kinds of bidirectional links... > >> >> I personally don't like this argument. It would lead to 100 applications >> with 100 copies of Xerces (lots of memory footprint) just in case >> it had a memory leak. > > Well, xml parsing is part of the j2ee spec so this is a different issue > from people tossing any old library into the classpath. > > But if a container bundles xerces then I would expect the container > provider to read the xerces documentation to make sure xerces is known > to be safe in such an environment and that there is nothing extra that > xerces requires in order to run correctly in that setup. As it happens, > I don't know of any such issues but I don't think such assumptions > should be made. See the java.beans.Introspector note above! > > >> And those "applications" in the case of infrastructure couldn't pass >> DOM objects around without serializing/deserializing them. > > Sorry, I don't follow this one. As mentioned above, j2ee servers provide > xml parsers by definition so apps don't (and shouldn't) bundle them. > > Are you perhaps talking about some scenario where: > * there is an interface I1 defined in a shared classpath > * app1 creates a concrete instance of interface I1, using a class > loaded from the local path > * app1 then performs a JNDI lookup or similar to get a reference to > some method of an object residing in app2 in the same JVM, > where that method takes an I1 as a parameter > * app1 then calls that external object passing its local instance > * app2 then caches a reference to the parameter > * app1 then leaks on deploy because app2 has a reference to an object > which has a class loaded from app1's classloader thereby retaining > app1's classloader including all the other classes. > > You know far more about j2ee than I do, so I'll let you tell me whether > this is a common scenario. Certainly ensuring that the implementation of > I1 is in the container's path rather than in the component's path would > solve this. But that whole setup sounds dodgy to me, and rather > unlikely. And pushing up the shared implementation classes into a common > classloader feels more like a workaround for a broken design than a > valid architecture. > > But if this *is* a common usage scenario then I agree I would have to > rethink my posting. > >> >> Hopefully, these problems will go away in JSE7 with a better >> definition of java modularization: >> http://www.jcp.org/en/jsr/detail?id=277 >> > > Hmm..interesting. Thanks for the link. > > Regards, > > Simon > > > > ------------------------------------------------------- > SF.Net email is Sponsored by the Better Software Conference & EXPO > September > 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices > Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA > Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ hibernate-devel mailing list hibernate-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/hibernate-devel