code: public void traverse(TraversalListener listener) {
      String		part;
      URLClassLoader 	sysLoader;
      List<URL> 		urls;
      TraversalState	state;
      String[] 		parts;
      List<String> 	elements;
      File		file;
      File[]		jars;
  
      // determine URLs of classpath
      if (JavaVersion.atLeast9()) {
        parts = System.getProperty("java.class.path").split(System.getProperty("path.separator"));
        elements = new ArrayList<>();
        for (String p: parts) {
          if (p.endsWith("*")) {
            file = new File(p.substring(0, p.length() - 1));
            jars = file.listFiles(new FileFilter() {
  	    @Override
  	    public boolean accept(File pathname) {
  	      return pathname.isFile() && pathname.getName().toLowerCase().endsWith(".jar");
  	    }
  	  });
            if (jars != null) {
              for (File jar : jars)
                elements.add(jar.getAbsolutePath());
            }
  	}
  	else {
            elements.add(p);
  	}
        }
        urls = new ArrayList<>();
        for (String el: elements) {
          try {
            file = new File(el);
            urls.add(file.toURI().toURL());
  	}
  	catch (Exception e) {
            System.err.println("[" + getClass().getName() + "] Failed to turn '" + el + "' into URL: " + e);
  	}
        }
      }
      else {
        sysLoader = (URLClassLoader) getClass().getClassLoader();
        urls = new ArrayList<>(Arrays.asList(sysLoader.getURLs()));
      }
  
      state = new TraversalState(listener);
      for (URL url : urls) {
        state.setURL(url);
        if (isLoggingEnabled())
  	getLogger().log(Level.INFO, "Classpath URL: " + url);
        part = url.toString();
        traverseClasspathPart(part, state);
      }
    }
docs: Traverses the classpath.
  
  @param listener 	the listener to use