Author: markt
Date: Thu Oct 27 13:59:41 2016
New Revision: 1766822

URL: http://svn.apache.org/viewvc?rev=1766822&view=rev
Log:
ThreadLocal leak detection is now hitting Java 9 module issues.
Catch the error and provide a useful error message if this happens.

Modified:
    tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
    tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java
    tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java

Modified: tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties?rev=1766822&r1=1766821&r2=1766822&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/loader/LocalStrings.properties Thu 
Oct 27 13:59:41 2016
@@ -13,7 +13,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-webappClassLoader.addExports=When running on Java 9 you need to add 
"--add-exports java.rmi/sun.rmi.transport=ALL-UNNAMED" to the JVM command line 
arguments to enable RMI Target memory leak detection. Alternatively, you can 
suppress this warning by disabling RMI Target memory leak detection.
+webappClassLoader.addExportsRmi=When running on Java 9 you need to add 
"--add-exports-private=java.rmi/sun.rmi.transport=ALL-UNNAMED" to the JVM 
command line arguments to enable RMI Target memory leak detection. 
Alternatively, you can suppress this warning by disabling RMI Target memory 
leak detection.
+webappClassLoader.addExportsThreadLocal=When running on Java 9 you need to add 
"--add-exports-private=java.base/java.lang=ALL-UNNAMED" to the JVM command line 
arguments to enable ThreadLocal memory leak detection. Alternatively, you can 
suppress this warning by disabling ThreadLocal memory leak detection.
 webappClassLoader.addPermisionNoCanonicalFile=Unable to obtain a canonical 
file path from the URL [{0}]
 webappClassLoader.addPermisionNoProtocol=The protocol [{0}] in the URL [{1}] 
is not supported so no read permission was granted for resources located at 
this URL
 webappClassLoader.illegalJarPath=Illegal JAR entry detected with name {0}

Modified: 
tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java?rev=1766822&r1=1766821&r2=1766822&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Thu 
Oct 27 13:59:41 2016
@@ -1860,10 +1860,17 @@ public abstract class WebappClassLoaderB
                 }
             }
         } catch (Throwable t) {
-            ExceptionUtils.handleThrowable(t);
-            log.warn(sm.getString(
-                    "webappClassLoader.checkThreadLocalsForLeaksFail",
-                    getContextName()), t);
+            JreCompat jreCompat = JreCompat.getInstance();
+            if (jreCompat.isInstanceOfInaccessibleObjectException(t)) {
+                // Must be running on Java 9 without the necessary command line
+                // options.
+                
log.warn(sm.getString("webappClassLoader.addExportsThreadLocal"));
+            } else {
+                ExceptionUtils.handleThrowable(t);
+                log.warn(sm.getString(
+                        "webappClassLoader.checkThreadLocalsForLeaksFail",
+                        getContextName()), t);
+            }
         }
     }
 
@@ -2116,7 +2123,7 @@ public abstract class WebappClassLoaderB
             if (jreCompat.isInstanceOfInaccessibleObjectException(e)) {
                 // Must be running on Java 9 without the necessary command line
                 // options.
-                log.warn(sm.getString("webappClassLoader.addExports"));
+                log.warn(sm.getString("webappClassLoader.addExportsRmi"));
             } else {
                 // Re-throw all other exceptions
                 throw e;

Modified: tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java?rev=1766822&r1=1766821&r2=1766822&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java Thu Oct 27 
13:59:41 2016
@@ -40,11 +40,11 @@ class Jre9Compat extends JreCompat {
 
 
     @Override
-    public boolean isInstanceOfInaccessibleObjectException(Exception e) {
-        if (e == null) {
+    public boolean isInstanceOfInaccessibleObjectException(Throwable t) {
+        if (t == null) {
             return false;
         }
 
-        return inaccessibleObjectExceptionClazz.isAssignableFrom(e.getClass());
+        return inaccessibleObjectExceptionClazz.isAssignableFrom(t.getClass());
     }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java?rev=1766822&r1=1766821&r2=1766822&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java Thu Oct 27 
13:59:41 2016
@@ -60,12 +60,12 @@ public class JreCompat {
      * Test if the provided exception is an instance of
      * java.lang.reflect.InaccessibleObjectException.
      *
-     * @param e The exception to test
+     * @param t The exception to test
      *
      * @return {@code true} if the exception is an instance of
      *         InaccessibleObjectException, otherwise {@code false}
      */
-    public boolean isInstanceOfInaccessibleObjectException(Exception e) {
+    public boolean isInstanceOfInaccessibleObjectException(Throwable t) {
         // Exception does not exist prior to Java 9
         return false;
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to