为什么 Java 模块的使用在大多数 Maven 项目中不可见/不明确? Maven 项目如何知道要依赖哪些模块?

问题描述 投票:0回答:1

众所周知,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 模块相关的问题/答案)。

java eclipse module java-module
1个回答
0
投票
多模块项目

的一部分出现,允许您对多个编译单元进行分组并在<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

© www.soinside.com 2019 - 2024. All rights reserved.