更新:我在这里回答了我自己的问题:
Scanning classpath/modulepath in runtime in Java 9
--
老问题-过时:
在Java 9模块系统中,可以使用
Set<ModuleReference> ms = ModuleFinder.ofSystem().findAll();然后,可以使用这些ModuleReference对象来列出每个模块的内容,方法如下:
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));
}要获得当前类的模块,可以使用
Module m = getClass().getModule();但是我似乎无法从这个ModuleReference中得到一个Module (所以我不能列出模块的内容,除了包),而非系统的Module没有被ModuleFinder列出。
两个问题:
java.class.path系统属性吗?(类型为AppClassLoader#ucp的URLClassPath字段不可见,并锁定在JRE 9中,因此您也无法通过内省获得它。)发布于 2017-12-22 05:50:26
这个怎么样:
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时,您可以使用这个列表做任何您想做的事情(例如,在每个模块中获取资源)。
https://stackoverflow.com/questions/47936315
复制相似问题