如何在Java 9中以编程方式获取所有模块的列表?

Pav*_*l_K 12 java java-9 java-module

如何通过Java代码获取当前JVM实例中所有模块的列表?可能吗?如果是,那怎么样?

Ala*_*man 13

ModuleLayer.boot().modules().stream()
                .map(Module::getName)
                .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

  • 仅当引导层是唯一的层时才会出现这种情况.如果模块由不同的类加载器加载,则此列表将不完整. (3认同)
  • 当然,但是代码片段会让问的人开始提问.当然,工具和调试器的API可以枚举VM中的所有模块,包括未命名的模块,但这超出了我怀疑的问题. (3认同)

Nam*_*man 7

使用 jar 或模块目录作为应用程序的输入,您可以使用 aModuleFinder开始,并进一步使用findAll来查找该查找器可以找到的所有模块引用的集合。

Path dir1, dir2, dir3;
ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
Set<ModuleReference> moduleReferences = finder.findAll();
Run Code Online (Sandbox Code Playgroud)

使用命令行选项可以轻松实现这一点,将模块列出为:

java -p <jarfile> --list-modules
Run Code Online (Sandbox Code Playgroud)

不过,如果您不想故意使用 和 进行调整,正如@Alan的回答所指出的ModuleLayer那样,这应该足够了。Configurationjava.lang.module