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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org