private synchronized List<Path> getRoots() throws IOException {
    final List<Path> cached = myRoots;
    if (cached != null) {
      return cached;
    }
    final FileSystem fs = FileSystems.newFileSystem(ROOT_URI, Collections.singletonMap("java.home", getBaseURL().getPath()));
    final List<Path> roots = new ArrayList<>();
    final Path modulesDir = fs.getPath("modules");
    Files.walkFileTree(modulesDir, new SimpleFileVisitor<Path>() {
      @Override
      public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        if (!modulesDir.equals(dir)) {
          roots.add(dir);
          return FileVisitResult.SKIP_SUBTREE;
        }
        return FileVisitResult.CONTINUE;
      }
    });
    myRoots = roots;
    return roots;
  }
private synchronized List<Path> getRoots()