ModRun教程

时间:2020-01-09 14:11:11  来源:igfitidea点击:

ModRun在没有Jigsaw项目的情况下为Java带来了模块化。模块化意味着能够将应用程序和API打包为带有额外元数据的"模块"(JAR文件)。额外的元数据会告诉我们模块(JAR文件)的版本,以及模块使用的依赖项(特定版本中的其他模块)。拥有此元数据可以更轻松地在运行时将模块及其依赖项加载到JVM中,以及解决依赖项冲突等。

ModRun GitHub存储库

我们可以在此处找到ModRun GitHub存储库:

ModRun GitHub存储库

ModRun使用Maven存储库

ModRun并没有发明新的模块存储库和元数据标准,而是使用了久经考验的Maven存储库结构。 ModRun可以在运行时直接从Maven存储库中加载模块。这意味着我们可以将所有模块保留在本地Maven存储库中,并直接从那里加载和运行所有模块。

标准化运行脚本

从Maven存储库加载所有JAR文件后,运行应用程序所需的脚本将变得更加标准化。我们只需告诉包含要运行的主类的模块,然后ModRun即可解析并加载其所有依赖项。

构建模块依赖图

当ModRun加载模块时,它将为模块构建依赖关系图。依赖关系图包含该模块的所有直接和传递依赖关系。该依赖关系图可以遍历并搜索类。加载类时,ModRun会执行此操作。我们也可以自己遍历依赖图。

每个模块一个ClassLoader

ModRun为依赖关系图中的每个模块分配一个单独的ClassLoader。请记住,模块表示特定版本的应用程序或者API。

通过使用其自己的ClassLoader加载模块的类,ModRun可以控制每个模块可见的类。模块只能从其自身或者其依赖项(模块)和可传递依赖项中查看类。模块无法在依赖关系图中看到"自身"之上的模块中的类。

通过使用自己的ClassLoader加载每个模块,ModRun可以同时将不同版本的相同API加载到JVM中。 JVM将从两个不同版本的API加载的类视为不同的类,因为它们加载了不同的ClassLoader实例。

ModRun还可以将相同版本的相同模块多次加载到同一JVM中。该模块的每个实例都具有从其依赖关系图中加载的类,这些类与该模块的其他实例隔离(至少如果需要的话)。

多租户

使用自己的ClassLoader从每个模块加载类,使应用程序的多租户更加容易。应用程序多租户意味着在同一个JVM中同时运行多个单独的应用程序。

ModRun可以同时将多个应用程序加载到同一个JVM中,并使它们的类彼此完全隔离,因此一个应用程序无法访问另一应用程序的类。因此,ModRun为应用程序多租户提供了一个简单,安全的模型。

ModRun Java示例

这是一个从Maven存储库创建模块,从模块加载类,创建该类的实例并通过反射对该实例调用方法的示例:

Repository repository = new Repository("test-repo");

Module modRunDepA = repository.createModule("com.nanosai", "ModRunDepA", "1.0.0");

String className1 = "com.nanosai.modrun.a.ComponentA";
Class  theClass1  = modRunDepA.getClassFromThisModule(className1);

Object theObject1 = theClass1.newInstance();

Method method1 = theClass1.getMethod("doIt");
String result1 = (String) method1.invoke(theObject1, new Object[0]);