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

java编译器:找不到模块。如何检查模块分辨率?,java,java-platform-module-system,Java,Java Platform Module System,在编译我的项目时,我得到一个“找不到模块”异常。我理解这意味着什么:显然我(传递性地)需要一个不在模块路径上的模块。但据我推断,我没有要求、使用或以其他方式使用该模块 我已经检查了module-info.java,并在编译器的模块路径上的所有jar上使用了jar--descripe模块,我在任何地方都找不到所提到的缺失模块。那么为什么编译器认为它丢失了呢 如果Maven中出现类似的情况,我将转储依赖关系树并查看该依赖关系来自何处。java可执行文件有一个--show模块解析,用于在运行时执行此操

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

我已经检查了module-info.java,并在编译器的模块路径上的所有jar上使用了jar--descripe模块,我在任何地方都找不到所提到的缺失模块。那么为什么编译器认为它丢失了呢

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


有什么方法可以获得编译器认为模块丢失的更多信息吗?

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

无法询问编译器如何构造其模块

正如Aniket所述,可以使用JDEP分析模块依赖关系。但是为了做到这一点,jdep需要访问编译器使用的所有jar,因为依赖信息在jar中

有一个Maven插件可以将所有依赖项复制到目标/依赖项中。默认情况下,它将包括所有范围,包括测试,所以需要一个特定的范围

mvn dependency:copy-dependencies -DincludeScope=compile
然后,您可以使用JDEP分析模块:

jdeps -summary -recursive --class-path target/dependency/*
这不会构造树,但会显示每个模块需要哪些模块


不幸的是,jdep不是很宽容,如果只缺少一个jar,它就会失败。我认为最好是打印已知的内容,包括任何损坏的引用,然后失败。

这不太可能。这个项目(github上的JFXtras)已经完全模块化和编译,我只想做一些更改。事实上,module-info.java存在于src/main/java中(我检查了上面提到的模块)。但是假设您的建议是正确的,编译器如何得出缺少未引用模块的结论?但这并不是我问题的答案:我想看看编译器的模块解析。你可以使用
jdeps-s…
来分析模块依赖关系图。jdeps似乎不是很方便,因为它需要访问所有jar来确定树(这当然有意义)。因此,它需要poms中定义的所有依赖项。从逻辑上说,我希望有一个maven插件来实现这一点,但显然还没有一个插件能够做到这一点。我试图用dependencies插件解决这个问题,但我一直在运行缺少的jar。基本上,您需要解析依赖项才能查看依赖项。但这是有道理的,因为信息是JAR的一部分。尽管我更希望JDEP打印出它知道的内容,而不是完全失败。在让JDEP工作后(maven dependencies插件复制了太多JAR),它似乎会转储类路径中包含的所有JAR的依赖项,而不是创建作为起点的树。这也是有意义的,因为这些JAR是依赖项,所以需要解析所有JAR。但它不会构造一棵树,这样您就可以跟踪流了。但这至少是件事。对不起,它说你缺少什么模块?你能试着创建一个新的解决方案吗?我的问题不是解决手头的问题,我知道如果有足够的时间,我可以做到(而且已经做到)。问题是如何从编译器那里获取所收集模块的信息;如何和从哪里来。就像Maven中的依赖树一样。事实证明,询问编译器是不可能的,而且如果出现问题,这种方法(JDEP)也没有帮助,因为遇到问题时它会立即失败。