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
> 
> 


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to