如何列出所有 JPMS 服务?

How to list all JPMS services?

如何列出所有模块的所有(!)JPMS 服务。我的意思是我需要 运行 JVM 当前可以使用的所有服务的列表。我已经在网上搜索了,还是找不到方法。

没有这样的命令,但你可以在命令行中组合一些东西来实现它。 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

艾伦·贝特曼在评论中给出了答案。

ModuleLayer.boot()
    .modules()
    .stream() 
    .map(Module::getDescriptor) 
    .filter(md -> !md.provides().isEmpty()) 
    .forEach(md -> System.out.format("%s -> %s%n", md.name(), md.provides()));