Java 如何列出所有JPMS服务?

Java 如何列出所有JPMS服务?,java,java-9,java-module,Java,Java 9,Java Module,如何列出所有模块的所有(!)JPMS服务。我的意思是,我需要在当前运行JVM时可以使用的所有服务的列表。我在互联网上搜索过,但仍然找不到方法。没有这样的命令,但您可以在命令行中组合一些东西来实现它。下面介绍如何在Linux上执行此操作 首先创建一个包含所有模块描述符的文件。(实际上,您不必这样做,您可以将其导入其余部分,但这部分需要时间,而且您可能更经常地需要它们,因此存储它们是有意义的。) 这将列出所有模块,删除版本字符串,然后让Java描述每个模块,其中包括模块描述符(以及使用和提供的服务)

如何列出所有模块的所有(!)JPMS服务。我的意思是,我需要在当前运行JVM时可以使用的所有服务的列表。我在互联网上搜索过,但仍然找不到方法。

没有这样的命令,但您可以在命令行中组合一些东西来实现它。下面介绍如何在Linux上执行此操作

首先创建一个包含所有模块描述符的文件。(实际上,您不必这样做,您可以将其导入其余部分,但这部分需要时间,而且您可能更经常地需要它们,因此存储它们是有意义的。)

这将列出所有模块,删除版本字符串,然后让Java描述每个模块,其中包括模块描述符(以及使用和提供的服务)

下一步是仅grep
uses
指令,删除
uses
部分,并在删除重复项的同时对其余类型名称进行排序:

cat /opt/jdk-9/module-descriptors
    | grep "uses"
    | sed 's/uses //'
    | sort -u

我已将输出输入。

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

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

谢谢你的回答。但是你能通过代码添加信息吗?我在运行JVM时问过-我是说通过代码。对于启动层中的模块,这可能接近您要查找的
ModuleLayer.boot().modules().stream().map(Module::getDescriptor).filter(md->!md.provides().isEmpty()).forEach(md->System.out.format(“%s->%s%n”,md.name()),md.provides())。请记住,您将无法访问某些服务类型。从你试图做的事情的陈述开始可能会更简单。@AlanBateman尽管我建议你将此作为一个答案,因为事实上,给定一个模块或模块层,这最接近于获取服务及其提供者的列表。还有一个问题,你所说的某些服务类型无法访问到底是什么意思。。有什么例子吗?jdk.management模块就是一个很好的例子。它们提供sun.management.spi.PlatformMBeanProvider的实现,这是一种JDK内部服务类型。我确信,一旦原始问题澄清了意图,就可以写出一个答案。@AlanBateman对重定向表示歉意,但从您那里得到一些关于这个问题的建议会有所帮助。只是引起注意。
ModuleLayer.boot()
    .modules()
    .stream() 
    .map(Module::getDescriptor) 
    .filter(md -> !md.provides().isEmpty()) 
    .forEach(md -> System.out.format("%s -> %s%n", md.name(), md.provides()));