On 20/10/2011 18:18, Bob DeRemer wrote: > Hi Tomcat Community: > > BACKGROUND: > I have a Servlet-based WEBAPP that is running in Tomcat7, JDK 1.6.0_27 on > Windows Server 2008 R2 64-bit - all 64-bit. We make use of class.newInstance > quite a bit as we have a fairly modular, interface-based system, and create > class instances on the fly. As part of our extensibility, I'm also using a > pretty well documented "hack" [The code is listed below] for dynamically > adding JAR(s) so they are accessible immediately without stopping our WEBAPP > or the actual Tomcat server process. This process has worked great for both > JAR(s) in the WEB-INF/lib and for ones we dynamically added - until you try > and stop the WEBAPP via the Tomcat manager app. > > PROBLEM: > This solution for dynamically loading JARs worked great as long as we > start/stop the actual Tomcat server process, but I found out the JAR(s) that > I have been dynamically loading this way are not released when you stop the > WEBAPP. I am using SysInternals Process Explorer to monitor the open file > handles of the Tomcat7 process. I can see that when I stop the WEBAPP, the > dynamically loaded JAR is still referenced. > > QUESTION: > I made an assumption that calling > Thread.currentThread().getContextClassLoader() would provide me the > classloader of my WEBAPP - which should be the same classloader that all the > JARs in the WEB-INF/lib are in. We control the WEBAPP, so I assumed this was > a safe assumption. > > The usage of the dynamically loaded JAR(s) is no different than the default > JAR(s) in WEB-INF/lib. None of the WEB-INF/lib JARs are left open when we > stop the WEBAPP - only the JAR(s) that are loaded via the "addUrl" approach > below. > > I have been through a number of online articles when I first created this > logic - including a PDF by Ted Neward [while at Developmentor] that described > these approaches, but am not sure how to troubleshoot this further now. > > If anyone has an answer or any suggestions, I would greatly appreciate it.
Do you have 'antiJarLocking' enabled on the Context? p > Thanks in advance, > Bob > > > Code to dynamically load JAR(s): > > public static void loadJarOnTheFly(File jarFile) throws IOException > { > Class<?>[] parameters = new Class[]{URL.class}; > > // IMPORTANT: MUST use the webapp classloader - so derived extension > classes can resolve their base classes > ClassLoader contextClassLoader = > Thread.currentThread().getContextClassLoader(); > > // cast to a URL class loader so we can additional JAR(s) to the search > path > URLClassLoader webappClassLoader = (URLClassLoader)contextClassLoader; > > Class<?> sysclass = URLClassLoader.class; > > try > { > URL jarUrl = jarFile.toURI().toURL(); > > Method method = sysclass.getDeclaredMethod("addURL", parameters); > method.setAccessible(true); > method.invoke(webappClassLoader, new Object[]{ jarUrl }); > } > catch (Throwable t) > { > throw new IOException("Error, could not add URL to system > classloader"); > } > } > > > > Bob DeRemer > Senior Director, Architecture and Development > > http://www.thingworx.com<http://www.thingworx.com/> > Skype: bob.deremer > O: 717.505.7923 > M: 717.881.3986 > >
signature.asc
Description: OpenPGP digital signature