/** * Creates a module sorter and loads the module hierarchy. * <p> * Finds all named modules providing a {@link ModuleHook} via module-info and sorts them * according to their dependencies. */ public ModuleSorter() { nameToModules = new HashMap<>(); urlToModules = new HashMap<>(); ServiceLoader.load(ModuleHook.class).stream().map(ServiceLoader.Provider::get).forEach(hook -> { ModuleInfo info = new ModuleInfo(hook); nameToModules.put(info.getModule().getName(), info); urlToModules.put(info.getUrlPath(), info); }); // depth-first sort (possible because jigsaw does not allow cyclic dependencies) sortedModules = new ArrayList<>(); for (ModuleInfo info: nameToModules.values()) { if (info.getOrdinal() == 0) { visit(info, sortedModules); } // else: module already sorted } }