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 2017/10/11 15:33:22 UTC

svn commit: r1811838 - in /tomcat/trunk/java/org/apache/tomcat/util: compat/Jre9Compat.java compat/JreCompat.java compat/LocalStrings.properties scan/StandardJarScanner.java

Author: markt
Date: Wed Oct 11 15:33:21 2017
New Revision: 1811838

URL: http://svn.apache.org/viewvc?rev=1811838&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=61597

Scan the module path as part of the standard Jar scanning when running
on Java 9.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java
    tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java
    tomcat/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java

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=1811838&r1=1811837&r2=1811838&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java Wed Oct 11 15:33:21 2017
@@ -19,29 +19,74 @@ package org.apache.tomcat.util.compat;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
 import java.net.URLConnection;
+import java.util.Deque;
+import java.util.Set;
 
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLParameters;
 
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
+
 class Jre9Compat extends JreCompat {
 
+    private static final Log log = LogFactory.getLog(Jre9Compat.class);
+    private static final StringManager sm = StringManager.getManager(Jre9Compat.class);
+
     private static final Class<?> inaccessibleObjectExceptionClazz;
     private static final Method setApplicationProtocolsMethod;
     private static final Method getApplicationProtocolMethod;
     private static final Method setDefaultUseCachesMethod;
+    private static final Method bootMethod;
+    private static final Method configurationMethod;
+    private static final Method modulesMethod;
+    private static final Method referenceMethod;
+    private static final Method locationMethod;
+    private static final Method isPresentMethod;
+    private static final Method getMethod;
 
     static {
+        Class<?> moduleLayerClazz = null;
+        Class<?> configurationClazz = null;
+        Class<?> resolvedModuleClazz = null;
+        Class<?> moduleReferenceClazz = null;
+        Class<?> optionalClazz = null;
+
         Class<?> c1 = null;
         Method m2 = null;
         Method m3 = null;
         Method m4 = null;
+        Method m5 = null;
+        Method m6 = null;
+        Method m7 = null;
+        Method m8 = null;
+        Method m9 = null;
+        Method m10 = null;
+        Method m11 = null;
 
         try {
+            moduleLayerClazz = Class.forName("java.lang.ModuleLayer");
+            configurationClazz = Class.forName("java.lang.module.Configuration");
+            resolvedModuleClazz = Class.forName("java.lang.module.ResolvedModule");
+            moduleReferenceClazz = Class.forName("java.lang.module.ModuleReference");
+            optionalClazz = Class.forName("java.util.Optional");
+
             c1 = Class.forName("java.lang.reflect.InaccessibleObjectException");
             m2 = SSLParameters.class.getMethod("setApplicationProtocols", String[].class);
             m3 = SSLEngine.class.getMethod("getApplicationProtocol");
             m4 = URLConnection.class.getMethod("setDefaultUseCaches", String.class, boolean.class);
+            m5 = moduleLayerClazz.getMethod("boot");
+            m6 = moduleLayerClazz.getMethod("configuration");
+            m7 = configurationClazz.getMethod("modules");
+            m8 = resolvedModuleClazz.getMethod("reference");
+            m9 = moduleReferenceClazz.getMethod("location");
+            m10 = optionalClazz.getMethod("isPresent");
+            m11 = optionalClazz.getMethod("get");
         } catch (SecurityException | NoSuchMethodException e) {
             // Should never happen
         } catch (ClassNotFoundException e) {
@@ -51,6 +96,13 @@ class Jre9Compat extends JreCompat {
         setApplicationProtocolsMethod = m2;
         getApplicationProtocolMethod = m3;
         setDefaultUseCachesMethod = m4;
+        bootMethod = m5;
+        configurationMethod = m6;
+        modulesMethod = m7;
+        referenceMethod = m8;
+        locationMethod = m9;
+        isPresentMethod = m10;
+        getMethod = m11;
     }
 
 
@@ -97,4 +149,30 @@ class Jre9Compat extends JreCompat {
             throw new UnsupportedOperationException(e);
         }
     }
+
+
+    @Override
+    public void addBootModulePath(Deque<URL> classPathUrlsToProcess) {
+        try {
+            Object bootLayer = bootMethod.invoke(null);
+            Object bootConfiguration = configurationMethod.invoke(bootLayer);
+            Set<?> resolvedModules = (Set<?>) modulesMethod.invoke(bootConfiguration);
+            for (Object resolvedModule : resolvedModules) {
+                Object moduleReference = referenceMethod.invoke(resolvedModule);
+                Object optionalURI = locationMethod.invoke(moduleReference);
+                Boolean isPresent = (Boolean) isPresentMethod.invoke(optionalURI);
+                if (isPresent.booleanValue()) {
+                    URI uri = (URI) getMethod.invoke(optionalURI);
+                    try {
+                        URL url = uri.toURL();
+                        classPathUrlsToProcess.add(url);
+                    } catch (MalformedURLException e) {
+                        log.warn(sm.getString("jre9Compat.invalidModuleUri", uri), e);
+                    }
+                }
+            }
+        } catch (ReflectiveOperationException e) {
+            throw new UnsupportedOperationException(e);
+        }
+    }
 }

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=1811838&r1=1811837&r2=1811838&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java Wed Oct 11 15:33:21 2017
@@ -19,6 +19,7 @@ package org.apache.tomcat.util.compat;
 import java.io.IOException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.Deque;
 
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLParameters;
@@ -115,4 +116,17 @@ public class JreCompat {
         URLConnection uConn = url.openConnection();
         uConn.setDefaultUseCaches(false);
     }
+
+
+    /**
+     * Obtains the URls for all the JARs on the module path when the JVM starts
+     * and adds them to the provided Deque.
+     *
+     * @param classPathUrlsToProcess    The Deque to which the modules should be
+     *                                  added
+     */
+    public void addBootModulePath(Deque<URL> classPathUrlsToProcess) {
+        // NO-OP for Java 8. There is no module path.
+    }
+
 }

Modified: tomcat/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties?rev=1811838&r1=1811837&r2=1811838&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties Wed Oct 11 15:33:21 2017
@@ -14,4 +14,6 @@
 # limitations under the License.
 
 jreCompat.noApplicationProtocols=Java Runtime does not support SSLParameters.setApplicationProtocols(). You must use Java 9 to use this feature.
-jreCompat.noApplicationProtocol=Java Runtime does not support SSLEngine.getApplicationProtocol(). You must use Java 9 to use this feature.
\ No newline at end of file
+jreCompat.noApplicationProtocol=Java Runtime does not support SSLEngine.getApplicationProtocol(). You must use Java 9 to use this feature.
+
+jre9Compat.invalidModuleUri=The module URI provided [{0}] could not be converted to a URL for the JarScanner to process

Modified: tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java?rev=1811838&r1=1811837&r2=1811838&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java Wed Oct 11 15:33:21 2017
@@ -273,9 +273,9 @@ public class StandardJarScanner implemen
             // instances of URLClassLoader. Use the class path in this
             // case.
             addClassPath(classPathUrlsToProcess);
+            // Also add any modules
+            JreCompat.getInstance().addBootModulePath(classPathUrlsToProcess);
             processURLs(scanType, callback, processedURLs, false, classPathUrlsToProcess);
-
-            // TODO Java 9 module path
         }
     }
 



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