ModRun教程
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]);