我正在尝试以编程方式加载使用 Java 平台模块系统的项目,因此我可以分析存在多少模块以及它们之间的关系。我写了以下代码:
public void retrieveModules() throws IOException {
moduleRefs = new ArrayList<ModuleReference>();
// search for all module-info.class
Stream<Path> classPaths = Files.walk(Paths.get(this.basePath));
List<String> moduleInfoClassFiles = classPaths
.filter(p -> p.getFileName()
.toString()
.toLowerCase()
.contains("module-info.class"))
.map(p -> p.toString())
.collect(Collectors.toList());
// load modules
for (String classFilePath : moduleInfoClassFiles) {
Path dir = Paths.get(classFilePath.replace("/module-info.class", ""));
ModuleFinder finder = ModuleFinder.of(dir);
moduleRefs.addAll(finder.findAll());
}
}
此代码在找到模块时一直运行良好finder.findAll()
,我可以检索正确的模块描述符。但是,当我尝试在 JUnit 5 上运行它时(https://github.com/junit-team/junit5)
我收到以下错误消息:
Exception in thread "main" java.lang.module.FindException: Error reading module: /.../junit-team_junit5/junit-platform-engine/build/classes/java/module/org.junit.platform.commons
at java.base/jdk.internal.module.ModulePath.readModule(ModulePath.java:350)
at java.base/jdk.internal.module.ModulePath.scan(ModulePath.java:237)
at java.base/jdk.internal.module.ModulePath.scanNextEntry(ModulePath.java:190)
at java.base/jdk.internal.module.ModulePath.findAll(ModulePath.java:166)
at RepoAnalyzer.retrieveModules(RepoAnalyzer.java:41)
at RepoAnalyzer.main(RepoAnalyzer.java:23)
Caused by: java.lang.module.InvalidModuleDescriptorException: Package org.junit.platform.commons.util not found in module
我试图找出问题所在。我验证了两个模块都正确导出和需要包。有谁知道我做错了什么?