如何列出所有模块的所有(!)JPMS服务。我的意思是我需要在运行JVM时可以在当前时刻使用的所有服务的列表。我在互联网上搜索过但仍无法找到方法。
答案 0 :(得分:1)
没有这样的命令,但你可以在命令行中放置一些东西来实现它。以下是如何在Linux上执行此操作。
首先使用所有模块描述符创建一个文件。 (你实际上并不需要,你可以把它管道到其余部分,但是这部分需要时间,你可能需要更频繁,所以存储它们是有意义的。)
java --list-modules
| sed -e 's/@.*//'
| xargs -n1 java --describe-module
> module-descriptors
这将列出所有模块,删除版本字符串,然后让Java描述每个模块,其中包括模块描述符(以及使用和提供的服务)。
下一步是仅grep uses
指令,删除uses
部分,并在删除重复项时对其余类型名称进行排序:
cat /opt/jdk-9/module-descriptors
| grep "uses"
| sed 's/uses //'
| sort -u
我已将输出放入a gist。
答案 1 :(得分:1)
Alan Bateman在评论中给出了答案。
ModuleLayer.boot()
.modules()
.stream()
.map(Module::getDescriptor)
.filter(md -> !md.provides().isEmpty())
.forEach(md -> System.out.format("%s -> %s%n", md.name(), md.provides()));