You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2016/08/25 20:59:59 UTC

svn commit: r1757754 - in /tomcat/tc7.0.x/trunk: java/org/apache/catalina/loader/LocalStrings.properties java/org/apache/catalina/loader/WebappClassLoaderBase.java webapps/docs/changelog.xml

Author: markt
Date: Thu Aug 25 20:59:58 2016
New Revision: 1757754

URL: http://svn.apache.org/viewvc?rev=1757754&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=60041
Better error message if a JAR is deleted while a web application is running. Note: Deleting a JAR while the application is running is not supported and errors are expected. Based on a patch by gehui.

Modified:
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties?rev=1757754&r1=1757753&r2=1757754&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/LocalStrings.properties Thu Aug 25 20:59:58 2016
@@ -56,6 +56,7 @@ webappClassLoader.checkThreadLocalsForLe
 webappClassLoader.checkThreadsHttpClient=Found HttpClient keep-alive thread using web application class loader. Fixed by switching thread to the parent class loader.
 webappClassLoader.getThreadGroupError=Unable to obtain the parent for ThreadGroup [{0}]. It will not be possible to check all threads for potential memory leaks
 webappClassLoader.loadedByThisOrChildFail=Failed to fully check the entries in an instance of [{0}] for potential memory leaks in context [{1}]
+webappClassLoader.jarOpenFail=Failed to open JAR [{0}]
 webappClassLoader.javaseClassLoaderNull=The j2seClassLoader attribute may not be null
 webappClassLoader.stopThreadFail=Failed to terminate thread named [{0}] for web application [{1}]
 webappClassLoader.stopTimerThreadFail=Failed to terminate TimerThread named [{0}] for web application [{1}]

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java?rev=1757754&r1=1757753&r2=1757754&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Thu Aug 25 20:59:58 2016
@@ -156,9 +156,9 @@ public abstract class WebappClassLoaderB
     private static final String CLASS_FILE_SUFFIX = ".class";
 
     private static final Manifest MANIFEST_UNKNOWN = new Manifest();
-    
+
     private static final Method GET_CLASSLOADING_LOCK_METHOD;
-    
+
     protected static final StringManager sm = StringManager.getManager(Constants.Package);
 
     static {
@@ -176,7 +176,7 @@ public abstract class WebappClassLoaderB
                     }
                 });
                 registerParallel.invoke(null);
-                getClassLoadingLockMethod = 
+                getClassLoadingLockMethod =
                         ClassLoader.class.getDeclaredMethod("getClassLoadingLock", String.class);
             }
         } catch (Exception e) {
@@ -187,7 +187,7 @@ public abstract class WebappClassLoaderB
         JVM_THREAD_GROUP_NAMES.add("RMI Runtime");
     }
 
-    
+
     protected class PrivilegedFindResourceByName
         implements PrivilegedAction<ResourceEntry> {
 
@@ -963,7 +963,7 @@ public abstract class WebappClassLoaderB
 
     }
 
-    
+
     protected void copyStateWithoutTransformers(WebappClassLoaderBase base) {
         base.antiJARLocking = this.antiJARLocking;
         base.resources = this.resources;
@@ -993,7 +993,7 @@ public abstract class WebappClassLoaderB
         base.searchExternalFirst = this.searchExternalFirst;
     }
 
-    
+
    /**
      * Add a new repository to the set of places this ClassLoader can look for
      * classes to be loaded.
@@ -1443,7 +1443,7 @@ public abstract class WebappClassLoaderB
 
         URL url = null;
         String path = nameToPath(name);
-        
+
         if (hasExternalRepositories && searchExternalFirst)
             url = super.findResource(name);
 
@@ -1770,7 +1770,7 @@ public abstract class WebappClassLoaderB
             if (log.isDebugEnabled())
                 log.debug("loadClass(" + name + ", " + resolve + ")");
             Class<?> clazz = null;
-    
+
             // Log access to stopped classloader
             if (!started) {
                 try {
@@ -1779,7 +1779,7 @@ public abstract class WebappClassLoaderB
                     log.info(sm.getString("webappClassLoader.stopped", name), e);
                 }
             }
-    
+
             // (0) Check our previously loaded local class cache
             clazz = findLoadedClass0(name);
             if (clazz != null) {
@@ -1789,7 +1789,7 @@ public abstract class WebappClassLoaderB
                     resolveClass(clazz);
                 return (clazz);
             }
-    
+
             // (0.1) Check our previously loaded class cache
             clazz = findLoadedClass(name);
             if (clazz != null) {
@@ -1799,7 +1799,7 @@ public abstract class WebappClassLoaderB
                     resolveClass(clazz);
                 return (clazz);
             }
-    
+
             // (0.2) Try loading the class with the system class loader, to prevent
             //       the webapp from overriding J2SE classes
             try {
@@ -1812,7 +1812,7 @@ public abstract class WebappClassLoaderB
             } catch (ClassNotFoundException e) {
                 // Ignore
             }
-    
+
             // (0.5) Permission to access this class when using a SecurityManager
             if (securityManager != null) {
                 int i = name.lastIndexOf('.');
@@ -1833,9 +1833,9 @@ public abstract class WebappClassLoaderB
                     }
                 }
             }
-    
+
             boolean delegateLoad = delegate || filter(name);
-    
+
             // (1) Delegate to our parent if requested
             if (delegateLoad) {
                 if (log.isDebugEnabled())
@@ -1853,7 +1853,7 @@ public abstract class WebappClassLoaderB
                     // Ignore
                 }
             }
-    
+
             // (2) Search local repositories
             if (log.isDebugEnabled())
                 log.debug("  Searching local repositories");
@@ -1869,7 +1869,7 @@ public abstract class WebappClassLoaderB
             } catch (ClassNotFoundException e) {
                 // Ignore
             }
-    
+
             // (3) Delegate to parent unconditionally
             if (!delegateLoad) {
                 if (log.isDebugEnabled())
@@ -1888,7 +1888,7 @@ public abstract class WebappClassLoaderB
                 }
             }
         }
-        
+
         throw new ClassNotFoundException(name);
     }
 
@@ -1903,8 +1903,8 @@ public abstract class WebappClassLoaderB
         }
         return this;
     }
-    
-    
+
+
     /**
      * Get the Permissions for a CodeSource.  If this instance
      * of WebappClassLoaderBase is for a web application context,
@@ -2102,7 +2102,7 @@ public abstract class WebappClassLoaderB
                 break;
             }
         }
-        
+
     }
 
 
@@ -3098,9 +3098,8 @@ public abstract class WebappClassLoaderB
                     try {
                         jarFiles[i] = new JarFile(jarRealFiles[i]);
                     } catch (IOException e) {
-                        if (log.isDebugEnabled()) {
-                            log.debug("Failed to open JAR", e);
-                        }
+                        log.warn(sm.getString("webappClassLoader.jarOpenFail", jarFiles[i]), e);
+                        closeJARs(true);
                         return false;
                     }
                 }
@@ -3613,8 +3612,8 @@ public abstract class WebappClassLoaderB
         path.append(name);
         return path.toString();
     }
-    
-    
+
+
     /**
      * Returns true if the specified package name is sealed according to the
      * given manifest.

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1757754&r1=1757753&r2=1757754&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Thu Aug 25 20:59:58 2016
@@ -154,6 +154,12 @@
       <fix>
         Fix a file descriptor leak when reading the global web.xml. (markt)
       </fix>
+      <fix>
+        <bug>60041</bug>: Better error message if a JAR is deleted while a web
+        application is running. Note: Deleting a JAR while the application is
+        running is not supported and errors are expected. Based on a patch by
+        gehui. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org