如何按依赖顺序正确加载项目的 类?
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();
}
您还需要进行检查以确保所有依赖项都存在,否则该方法将继续循环。
我正在 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();
}
您还需要进行检查以确保所有依赖项都存在,否则该方法将继续循环。