首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何枚举Java 9中的非系统模块

如何枚举Java 9中的非系统模块
EN

Stack Overflow用户
提问于 2017-12-22 05:33:30
回答 1查看 193关注 0票数 4

更新:我在这里回答了我自己的问题:

Scanning classpath/modulepath in runtime in Java 9

--

老问题-过时:

在Java 9模块系统中,可以使用

代码语言:javascript
复制
Set<ModuleReference> ms = ModuleFinder.ofSystem().findAll();

然后,可以使用这些ModuleReference对象来列出每个模块的内容,方法如下:

代码语言:javascript
复制
for (ModuleReference m : ms) {
    System.out.println(m.descriptor().name());
    System.out.println(" " + m.descriptor().toNameAndVersion());
    System.out.println(" " + m.descriptor().packages());
    System.out.println(" " + m.descriptor().exports());
    Optional<URI> location = m.location();
    if (location.isPresent()) {
        System.out.println(" " + location.get()); // e.g. "jrt:/java.base"
    }
    m.open().list().forEach(s -> System.out.println("  " + s));
}

要获得当前类的模块,可以使用

代码语言:javascript
复制
Module m = getClass().getModule();

但是我似乎无法从这个ModuleReference中得到一个Module (所以我不能列出模块的内容,除了包),而非系统的Module没有被ModuleFinder列出。

两个问题:

  1. 如何枚举非系统模块中的资源?
  2. 如何在JRE 9中读取非模块类路径?我应该依赖java.class.path系统属性吗?(类型为AppClassLoader#ucpURLClassPath字段不可见,并锁定在JRE 9中,因此您也无法通过内省获得它。)
EN

回答 1

Stack Overflow用户

发布于 2017-12-22 05:50:26

这个怎么样:

代码语言:javascript
复制
Set<String> systemModuleNames = ModuleFinder
        .ofSystem()
        .findAll()
        .stream()
        .map(moduleRef -> moduleRef.descriptor().name())
        .collect(Collectors.toSet());

List<Module> nonSystemModules = ModuleLayer
        .boot()
        .modules()
        .stream()
        .filter(m -> !systemModuleNames.contains(m.getName()))
        .collect(Collectors.toList());

System.out.println(nonSystemModules);

现在,当您拥有nonSystemModules时,您可以使用这个列表做任何您想做的事情(例如,在每个模块中获取资源)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47936315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档