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