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 16:07:32 UTC
svn commit: r1811846 [2/2] - in /tomcat/tc7.0.x/trunk: ./
java/org/apache/tomcat/util/compat/ java/org/apache/tomcat/util/scan/
webapps/docs/
Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java?rev=1811846&r1=1811845&r2=1811846&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java Wed Oct 11 16:07:32 2017
@@ -19,29 +19,81 @@ 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 org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
class Jre9Compat extends Jre8Compat {
+ 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 setDefaultUseCaches;
+ 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 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");
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 e) {
// Should never happen
- } catch (ClassNotFoundException e) {
- // Must be Java 8
} catch (NoSuchMethodException e) {
// Should never happen
+ } catch (ClassNotFoundException e) {
+ // Must be Java 8
}
inaccessibleObjectExceptionClazz = c1;
- setDefaultUseCaches = m4;
+ setDefaultUseCachesMethod = m4;
+ bootMethod = m5;
+ configurationMethod = m6;
+ modulesMethod = m7;
+ referenceMethod = m8;
+ locationMethod = m9;
+ isPresentMethod = m10;
+ getMethod = m11;
}
@@ -63,13 +115,43 @@ class Jre9Compat extends Jre8Compat {
@Override
public void disableCachingForJarUrlConnections() throws IOException {
try {
- setDefaultUseCaches.invoke(null, "JAR", Boolean.FALSE);
+ setDefaultUseCachesMethod.invoke(null, "JAR", Boolean.FALSE);
} catch (IllegalAccessException e) {
throw new UnsupportedOperationException(e);
} catch (IllegalArgumentException e) {
throw new UnsupportedOperationException(e);
} catch (InvocationTargetException e) {
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 (IllegalArgumentException e) {
+ throw new UnsupportedOperationException(e);
+ } catch (IllegalAccessException e) {
+ throw new UnsupportedOperationException(e);
+ } catch (InvocationTargetException e) {
+ throw new UnsupportedOperationException(e);
}
}
}
Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java?rev=1811846&r1=1811845&r2=1811846&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/JreCompat.java Wed Oct 11 16:07:32 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 java.util.Locale;
import javax.net.ssl.SSLEngine;
@@ -179,4 +180,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/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties?rev=1811846&r1=1811845&r2=1811846&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/compat/LocalStrings.properties Wed Oct 11 16:07:32 2017
@@ -13,4 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-jreCompat.noServerCipherSuiteOrder=Java Runtime does not support "useServerCipherSuitesOrder". You must use Java 8 or later to use this feature.
\ No newline at end of file
+jreCompat.noServerCipherSuiteOrder=Java Runtime does not support "useServerCipherSuitesOrder". You must use Java 8 or later 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/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java?rev=1811846&r1=1811845&r2=1811846&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java Wed Oct 11 16:07:32 2017
@@ -26,7 +26,9 @@ import java.net.URLClassLoader;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Deque;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
@@ -250,6 +252,11 @@ public class StandardJarScanner implemen
// instances of URLClassLoader. Use the class path in this
// case.
List<URL> urls = getClassPath();
+ // Also add any modules
+ Deque<URL> modulePathUrls = new LinkedList<URL>();
+ JreCompat.getInstance().addBootModulePath(modulePathUrls);
+ urls.addAll(modulePathUrls);
+ // Process URLs
for (URL url : urls) {
if (!processedURLs.contains(url)) {
try {
@@ -260,8 +267,6 @@ public class StandardJarScanner implemen
}
}
}
-
- // TODO Java 9 module path
}
}
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=1811846&r1=1811845&r2=1811846&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Wed Oct 11 16:07:32 2017
@@ -71,6 +71,11 @@
<bug>61581</bug>: Fix possible <code>SecurityException</code> when using
the APR/native connector with a <code>SecurityManager</code>. (markt)
</fix>
+ <fix>
+ <bug>61597</bug>: Extend the <code>StandardJarScanner</code> to scan
+ JARs on the module path when running on Java 9 and class path scanning
+ is enabled. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Web applications">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org