docs: public static List getClasspathComponents()
      {
          List components = new LinkedList();
  
          // walk the classloader hierarchy, trying to get all the components we can
          ClassLoader cl = Thread.currentThread().getContextClassLoader();
  
          while ((null != cl) && (cl instanceof URLClassLoader))
          {
              URLClassLoader ucl = (URLClassLoader) cl;
              components.addAll(getUrlClassLoaderClasspathComponents(ucl));
  
              try
              {
                  cl = ucl.getParent();
              }
              catch (SecurityException se)
              {
                  cl = null;
              }
          }
  
          // walking the hierarchy doesn't guarantee we get everything, so
          // lets grab the system classpath for good measure.
          String classpath = System.getProperty("java.class.path");
          String separator = System.getProperty("path.separator");
          StringTokenizer st = new StringTokenizer(classpath, separator);
          while (st.hasMoreTokens())
          {
              String component = st.nextToken();
              // Calling File.getPath() cleans up the path so that it's using
              // the proper path separators for the host OS
              component = getCanonicalPath(component);
              components.add(component);
          }
  
          // Set removes any duplicates, return a list for the api.
          return new LinkedList(new HashSet(components));
      }