如何列出所有JPMS服务?

时间:2018-01-11 19:25:09

标签: java java-9 java-module

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

2 个答案:

答案 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()));