1

我已经看到,在一个项目中module-info.javamaven将模块化 jars(包含module-info.class或清单属性Automatic-Module-Name)添加--module-path-classpath.

规范指出:

[...] 但是,这并不意味着命名模块中的代码可以访问未命名模块中的类型。实际上,命名模块甚至不能声明对未命名模块的依赖。这种限制是故意的[...]

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

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

4

1 回答 1

1

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

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

于 2020-07-07T19:50:02.240 回答