private Loader createLoader(@NotNull URL url, @NotNull File file, boolean processRecursively) throws IOException {
    if (file.isDirectory()) {
      return new FileLoader(url, this);
    }
    if (!file.isFile()) {
      return null;
    }

    boolean isSigned = myURLsWithProtectionDomain.contains(url);
    JarLoader loader = isSigned ? new SecureJarLoader(url, file.getPath(), this) : new JarLoader(url, file.getPath(), this);
    if (processRecursively) {
      String[] referencedJars = loadManifestClasspath(loader);
      if (referencedJars != null) {
        long s2 = recordLoadingInfo ? System.nanoTime() : 0;
        List<URL> urls = new ArrayList<>(referencedJars.length);
        for (String referencedJar : referencedJars) {
          try {
            urls.add(new URI(referencedJar).toURL());
          }
          catch (Exception e) {
            LoggerRt.getInstance(ClassPath.class).warn("url: " + url + " / " + referencedJar, e);
          }
        }
        push(urls);
        if (recordLoadingInfo) {
          //noinspection UseOfSystemOutOrSystemErr
          System.out.println("Loaded all " + referencedJars.length + " urls " + (System.nanoTime() - s2) / 1000000 + "ms");
        }
      }
    }
    return loader;
  }
private Loader createLoader(@NotNull URL url, @NotNull File file, boolean processRecursively)