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/05 19:35:23 UTC

svn commit: r1811241 - /tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java

Author: markt
Date: Thu Oct  5 19:35:23 2017
New Revision: 1811241

URL: http://svn.apache.org/viewvc?rev=1811241&view=rev
Log:
Start to improved Java 9 JAR scanning
Make StandardJarScanner easier to extend

Modified:
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/scan/StandardJarScanner.java

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=1811241&r1=1811240&r2=1811241&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 Thu Oct  5 19:35:23 2017
@@ -20,11 +20,14 @@ package org.apache.tomcat.util.scan;
 import java.io.File;
 import java.io.IOException;
 import java.net.JarURLConnection;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
-import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import java.util.StringTokenizer;
 
@@ -36,6 +39,7 @@ import org.apache.tomcat.JarScanner;
 import org.apache.tomcat.JarScannerCallback;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.buf.UriUtil;
+import org.apache.tomcat.util.compat.JreCompat;
 import org.apache.tomcat.util.file.Matcher;
 import org.apache.tomcat.util.res.StringManager;
 
@@ -155,9 +159,7 @@ public class StandardJarScanner implemen
         // Scan WEB-INF/lib
         Set<String> dirList = context.getResourcePaths(Constants.WEB_INF_LIB);
         if (dirList != null) {
-            Iterator<String> it = dirList.iterator();
-            while (it.hasNext()) {
-                String path = it.next();
+            for (String path : dirList) {
                 if (path.endsWith(Constants.JAR_EXT) &&
                     !Matcher.matchName(ignoredJars,
                         path.substring(path.lastIndexOf('/')+1))) {
@@ -189,58 +191,109 @@ public class StandardJarScanner implemen
 
         // Scan the classpath
         if (scanClassPath && classloader != null) {
-            if (log.isTraceEnabled()) {
-                log.trace(sm.getString("jarScan.classloaderStart"));
-            }
 
-            ClassLoader loader = classloader;
+        }
+    }
 
-            ClassLoader stopLoader = null;
-            if (!scanBootstrapClassPath) {
-                // Stop when we reach the bootstrap class loader
-                stopLoader = ClassLoader.getSystemClassLoader().getParent();
-            }
 
-            while (loader != null && loader != stopLoader) {
-                if (loader instanceof URLClassLoader) {
-                    URL[] urls = ((URLClassLoader) loader).getURLs();
-                    for (int i=0; i<urls.length; i++) {
-                        // Extract the jarName if there is one to be found
-                        String jarName = getJarName(urls[i]);
-
-                        // Skip JARs known not to be interesting and JARs
-                        // in WEB-INF/lib we have already scanned
-                        if (jarName != null &&
-                            !(Matcher.matchName(ignoredJars, jarName) ||
-                                urls[i].toString().contains(
-                                        Constants.WEB_INF_LIB + jarName))) {
-                            if (log.isDebugEnabled()) {
-                                log.debug(sm.getString("jarScan.classloaderJarScan", urls[i]));
-                            }
-                            try {
-                                process(callback, urls[i]);
-                            } catch (IOException ioe) {
-                                log.warn(sm.getString(
-                                        "jarScan.classloaderFail",urls[i]), ioe);
-                            }
-                        } else {
-                            if (log.isTraceEnabled()) {
-                                log.trace(sm.getString("jarScan.classloaderJarNoScan", urls[i]));
-                            }
+    protected void doScanClassPath(ClassLoader classloader, JarScannerCallback callback,
+            Set<String> ignoredJars) {
+
+        if (log.isTraceEnabled()) {
+            log.trace(sm.getString("jarScan.classloaderStart"));
+        }
+
+        ClassLoader loader = classloader;
+
+        ClassLoader stopLoader = null;
+        if (!scanBootstrapClassPath) {
+            // Stop when we reach the bootstrap class loader
+            stopLoader = ClassLoader.getSystemClassLoader().getParent();
+        }
+
+        Set<URL> processedURLs = new HashSet<URL>();
+
+        while (loader != null && loader != stopLoader) {
+            if (loader instanceof URLClassLoader) {
+                URL[] urls = ((URLClassLoader) loader).getURLs();
+                for (int i=0; i<urls.length; i++) {
+                    // Extract the jarName if there is one to be found
+                    String jarName = getJarName(urls[i]);
+
+                    // Skip JARs known not to be interesting and JARs
+                    // in WEB-INF/lib we have already scanned
+                    if (jarName != null &&
+                        !(Matcher.matchName(ignoredJars, jarName) ||
+                            urls[i].toString().contains(
+                                    Constants.WEB_INF_LIB + jarName))) {
+                        if (log.isDebugEnabled()) {
+                            log.debug(sm.getString("jarScan.classloaderJarScan", urls[i]));
+                        }
+                        try {
+                            process(callback, urls[i]);
+                            processedURLs.add(urls[i]);
+                        } catch (IOException ioe) {
+                            log.warn(sm.getString("jarScan.classloaderFail",urls[i]), ioe);
+                        }
+                    } else {
+                        if (log.isTraceEnabled()) {
+                            log.trace(sm.getString("jarScan.classloaderJarNoScan", urls[i]));
                         }
                     }
                 }
-                loader = loader.getParent();
             }
+            loader = loader.getParent();
+        }
 
+        if (JreCompat.isJre9Available()) {
+            // The application and platform class loaders are not
+            // instances of URLClassLoader. Use the class path in this
+            // case.
+            List<URL> urls = getClassPath();
+            for (URL url : urls) {
+                if (!processedURLs.contains(url)) {
+                    try {
+                        process(callback, url);
+                        processedURLs.add(url);
+                    } catch (IOException ioe) {
+                        log.warn(sm.getString("jarScan.classloaderFail",url), ioe);
+                    }
+                }
+            }
+
+            // TODO Java 9 module path
+        }
+
+    }
+
+
+    protected List<URL> getClassPath() {
+        String classPath = System.getProperty("java.class.path");
+
+        if (classPath == null || classPath.length() == 0) {
+            return Collections.emptyList();
+        }
+
+        String[] classPathEntries = classPath.split(File.pathSeparator);
+        List<URL> urls = new ArrayList<URL>(classPathEntries.length);
+        for (String classPathEntry : classPathEntries) {
+            File f = new File(classPath);
+            try {
+                urls.add(f.toURI().toURL());
+            } catch (MalformedURLException e) {
+                log.warn(sm.getString("jarScan.classPath.badEntry", classPathEntry), e);
+            }
         }
+
+        return urls;
     }
 
+
     /*
      * Scan a URL for JARs with the optional extensions to look at all files
      * and all directories.
      */
-    private void process(JarScannerCallback callback, URL url)
+    protected void process(JarScannerCallback callback, URL url)
             throws IOException {
 
         if (log.isTraceEnabled()) {



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