private void loadClassesFromDirectory(
     File directoryToScan, String current, List<String> classList) {
   logger.debug("Scan directory " + directoryToScan);
   for (File f : directoryToScan.listFiles()) {
     if (f.isDirectory()) {
       if (!".".equals(f.getName()) && !"..".equals(f.getName())) {
         loadClassesFromDirectory(f, current + "." + f.getName(), classList);
       }
     } else {
       if (f.getName().endsWith(".class")) {
         classList.add(
             current + "." + f.getName().substring(0, f.getName().length() - ".class".length()));
       }
     }
   }
   logger.debug("Directory scanned " + directoryToScan);
 }
 private List<String> findScannedClasses() throws Exception {
   List<String> classList = new ArrayList<String>();
   for (String s : scanPackageSet) {
     String path = s.replaceAll("\\.", "/");
     logger.debug("Scan package " + s);
     Enumeration<URL> l = classLoader.getResources(path);
     while (l.hasMoreElements()) {
       URL url = l.nextElement();
       String u = url.toExternalForm();
       if (u.startsWith("file:")) {
         String directoryName = u.substring("file:".length());
         directoryName = URLDecoder.decode(directoryName, "UTF-8");
         loadClassesFromDirectory(new File(directoryName), s, classList);
       } else if (u.startsWith("jar:file:")) {
         loadClassesFromJarFile(u.substring("jar:file:".length()), s, classList);
       } else {
         throw new RuntimeException("Not managed class container " + u);
       }
     }
   }
   return classList;
 }