编译模块时,将非模块化 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,我决定选择一个干净的模块路径:只把罐子放在真正使用的模块路径。其余的最终在类路径上。
我看到在 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,我决定选择一个干净的模块路径:只把罐子放在真正使用的模块路径。其余的最终在类路径上。