我正在用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(由于按字母顺序循环浏览文件),但应按所需依赖关系的顺序加载。
答案 0 :(得分:0)
使用Maven和Multi-Module Project怎么样?
您可以在GitHub上找到多个模块项目的示例,例如maven-surefire和its 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();
}
您还需要进行检查以确保所有依赖项都存在,否则该方法将继续循环。