编译模块时,将非模块化 jar 添加到 -classpath 并将模块化 jar 添加到 --module-path 的价值是什么?

What is the value of adding non-modular jars to the -classpath and modular jars to the --module-path when compiling a module?

我看到在 module-info.java 的项目中,maven 添加了模块化 jar(包含 module-info.class 或清单 属性 Automatic-Module-Name ),到 --module-path,其余罐子到 -classpath

但是 spec 指出:

[...] It does not, however, mean that code in a named module can access types in the unnamed module. A named module cannot, in fact, even declare a dependence upon the unnamed module. This restriction is intentional[...]

据我所知,来自类路径的非模块化 jar 的包被添加到未命名的模块中。

由于不允许模块化项目源访问未命名模块的类型,在上述情况下向 -classpath 添加任何 jar 的目的是什么?

它更微妙。需要了解模块路径的 Apache Maven 插件使用 Plexus Java。这可以基于模块描述符构建所有必需模块的树。它理解模块信息文件 Automatic-Module-Name,也理解基于文件名的自动模块。 理想情况下,类路径中不应出现任何内容,这通常意味着您引入了太多(传递性)依赖项。 但是,在某些情况下,jar 无法在模块路径中结束(文件名无法转换为模块名,文件名冲突),因此您需要其他技巧。 https://openjdk.java.net/jeps/261 显示了您可以提供的附加参数列表,以便在 modulepath 和 classpath/files 之间进行交互。

我本可以选择简单的解决方案(将所有内容都放在模块路径上,让 javac/java 决定它需要什么),但是对于 Maven,我决定选择一个干净的模块路径:只把罐子放在真正使用的模块路径。其余的最终在类路径上。