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

时间:2019-06-30 16:12:00

标签: java dependency-management

我正在用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(由于按字母顺序循环浏览文件),但应按所需依赖关系的顺序加载。

2 个答案:

答案 0 :(得分:0)

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

您可以在GitHub上找到多个模块项目的示例,例如maven-surefireits list of modules

答案 1 :(得分:0)

您可以递归地遍历您的依赖项。仔细检查它们,消除那些已经加载了依赖的对象(开始时,只会是那些没有依赖的对象)。然后,您可以继续进行操作,将加载更多的依赖项,然后很快所有这些依赖项就会出现。

这是它进行过程的直观表示。 第一个周期:

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();
}

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