众所周知,Java 模块(平台模块系统)已在 Java 9 中引入。尽管如此,从那时起我个人就再也没有机会明确地使用模块。同时,我看到的每个与 Java 相关的教程也没有明确使用它。我的意思是,我从未见过人们真正使用 module-info.java
文件,就好像这个功能完全没有被使用过一样。虽然,看起来它是在“幕后”使用的。一些或我自己的 Maven 项目在 Java 构建路径下列出了“模块依赖项”,但其中一些没有。它们都是 Spring Boot 项目。这是怎么发生的?如果我没有明确使用
module-info.java
并且没有说 requires java.sql;
之类的东西,Maven 如何知道要依赖哪个模块?谢谢你。P.S.:问题源于 Eclipse IDE 问题,突然无法解析 java.sql.* 导入,大多数逻辑解决方案会说 requires java.sql;
,尽管它列在“模块依赖项”下,所以它会以某种方式自动链接。 .所以我想了解幕后发生的事情。
P.P.S.:我尝试在 Stack Overflow 上搜索可能的答案,但没有找到(主要是 Maven 模块相关的问题/答案)。
的一部分出现,允许您对多个编译单元进行分组并在<dependencies>
部分中表达它们之间的依赖关系,而无需将它们安装到本地 Maven 存储库才能成功编译。
module-info.java
)时,你的所有类都位于
类路径或未命名模块中,并且Maven还将放置你的所有依赖项(以及它们的依赖项等等)列在类路径上
<dependencies>
的 pom.xml
部分中,无论您是否在代码中实际使用它们。类路径上的类可以读取所有其他类,即使它们位于未导出的包中(根据 module-info.class
。)有一个例外:从 Java 17 开始,JDK 模块始终被视为位于模块路径上,因此即使从类路径中也无法访问其内部包,至少除非您使用
--add-exports
或
--add-opens
在命令行上。这是最后的手段,鼓励依赖 JDK 内部的库不再使用它们。如果您通过添加 module-info.class
使项目模块化,Maven 现在会将您的依赖项放在
模块路径上。 JPMS 模块不能依赖于类路径,因此您在代码中直接访问的每个依赖项,即使它没有指定
module-info.class
,也没有 Automatic-Module-Name
,也必须位于模块路径上并且是您所需要的
module-info.java
。