如何按依赖顺序正确加载项目的 类?

How can I properly load my project's classes in order of dependencies?

我正在 Java 中开发一个项目,我希望按照模块之间的相互需求顺序加载模块。模块加载器的工作方式是在 modules 文件夹中查找,从那里循环遍历文件夹,并在每个文件夹中找到一个 module.json。在该文件中,有一个部分如下:

"dependencies": [
 "AModuleDependency"
]

它使用了一个模块的名称,并且该模块必须在这个模块之前加载。我不知道如何正确地级联这个过程。有些模块没有任何依赖关系(在这种情况下 dependencies 不会存在),而有些模块有很多依赖关系。在Java中有什么方法可以轻松传达这个过程。谢谢。如果你没有完全理解。我举个例子。

(模块目录)

modules /
  ModuleOne /
    module.jar
    pango.json -> dependencies -> ModuleW
  ModuleW
    module.jar
    pango.json -> dependencies -> ModuleZ
  ModuleZ
    module.jar
    pango.json

模块加载器想要加载 ModuleOne、ModuleW,然后是 ModuleZ(由于循环文件是按字母顺序排列的),但它应该按照它需要的依赖项的顺序加载。

使用 Maven 和 Multi-Module Project 怎么样?

您可以在 GitHub 上找到 multi-modules 个项目的示例,例如:maven-surefire and its list of modules

您可以递归循环遍历您的依赖项。遍历它们,消除已经加载了依赖项的那些(一开始,它只会是那些没有任何依赖项的)。然后你可以继续,更多的依赖将被加载,然后很快,所有的。

这是它如何进行的直观表示。 第一周期:

Plugin1 : Depends on Plugin3 and Plugin4
Plugin2 : Depends on nothing             X (all of their dependencies are already loaded)
Plugin3: Depends on Plugin2
Plugin4: Depends on nothing              X

第二个周期:

Plugin1 : Depends on Plugin3 and Plugin4
Plugin3: Depends on Plugin2              X (all of its dependencies have already been loaded)

第三个周期:

Plugin1 : Depends on Plugin3 and Plugin4 X (all of its dependencies have already been loaded)

现在一切都按正确的顺序加载了!既然你用 Java 标记了这个,我也会写一个代码示例。

private final List<Plugin> unloadedPlugins;
private final List<Plugin> loadedPlugins;

public void loadPlugins() {
  List<Plugin> toRemove = new ArrayList<>();
  for (Plugin plugin : unloadedPlugins) {
    if (loadedPlugins.containsAll(plugin.getDependencies()) {
      plugin.load();
      loadedPlugins.add(plugin);
      toRemove.add(plugin);
    }
  }

  unloadedPlugins.removeAll(toRemove);

  if (unloadedPlugins.size > 0) loadDependencies();
}

您还需要进行检查以确保所有依赖项都存在,否则该方法将继续循环。