java 编译器:未找到模块。如何检查模块分辨率?

java compiler: module not found. How to inspect module resolution?

编译我的项目时出现“找不到模块”异常。我明白这意味着什么:显然我(传递地)需要一个不在模块路径上的模块。但据我所知,我没有要求、使用或以其他方式使用该模块。

我已经检查了模块-info.java,并对编译器模块路径上的所有 jar 使用了 jar --describe-module,但我什至找不到提到的那个丢失的模块。那么为什么编译器认为它丢失了呢?

如果在 Maven 中出现类似的情况,我会转储依赖树并查看该依赖项来自何处。 java 可执行文件有一个 --show-module-resolution 用于在运行时执行此操作,但这对编译器不起作用。

是否有任何方法可以获取有关编译器认为缺少模块的原因的更多信息?

错误“找不到模块”是因为Java 编译器无法找到module-info.java 文件。我认为您必须确保它位于正确的目录路径中。此错误表示模块文件在提供的模块路径中不可用。

不可能询问编译器它是如何构建其模块的。

正如 Aniket 所说,可以使用 jdeps 来分析模块依赖关系。但是为了这样做,jdeps 需要访问编译器使用的所有 jar,因为依赖信息在 jars 中。

有一个 Maven 插件可以将所有依赖项复制到 target/dependencies。默认情况下,它将包括所有范围,包括测试,因此需要具体说明。

mvn dependency:copy-dependencies -DincludeScope=compile

然后就可以使用jdeps来分析模块了:

jdeps -summary -recursive --class-path target/dependency/*

这不会构建树,但会显示每个模块需要哪些模块。

不幸的是,jdeps 不是很宽容,如果只缺少一个 jar 就会失败。恕我直言,最好打印已知的内容,包括任何损坏的参考,然后失败。