【问题标题】:What is the value of adding non-modular jars to the -classpath and modular jars to the --module-path when compiling a module?编译模块时,将非模块化 jars 添加到 -classpath 并将模块化 jars 添加到 --module-path 有什么价值?
【发布时间】:2020-10-28 00:15:11
【问题描述】:

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

但是spec 声明:

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

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

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

【问题讨论】:

    标签: java maven classpath module-path unnamed-module


    【解决方案1】:

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

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

    【讨论】:

    • 现在更清楚了。我想我最初错过了一些东西,我现在看到了。 module-info 中非“必需”的依赖项最终位于 -classpath即使对于命名模块(内部包含module-info)也会发生这种情况。它是否正确?如果是,我在标题中的问题表述错误。
    • 不完全是,重要的代码是github.com/codehaus-plexus/plexus-languages/blob/master/…。在这里,jar 被提供给 JDK 以获取其模块名称,因此它的行为 100% 相同。
    • 很高兴知道这部分。作为记录,我还添加了一些测试代码,这导致我得出上述结论:repl.it/@stackit/module-inclasspath-test1#README.md
    猜你喜欢
    • 2012-06-11
    • 2012-01-18
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2015-10-19
    • 2020-06-16
    相关资源
    最近更新 更多