【问题标题】:How does Maven work with Java 9 modules?Maven 如何与 Java 9 模块一起工作?
【发布时间】:2018-04-11 09:46:16
【问题描述】:

如果我的项目中有所有类型的模块(应用程序、自动和未命名的),Maven 将如何与它们一起工作? 我可以强制 Maven 将一些 jar 视为自动模块,而其他模块则保留在类路径中。 Maven如何逐步迁移到模块系统?

【问题讨论】:

标签: maven java-9 java-platform-module-system


【解决方案1】:

Maven 只是管理你的依赖项(jars)。它不关心依赖项是否是 java 模块。

Maven 可以提供帮助的唯一方法是,如果您通过 Maven(例如 mvn spring-boot:run)启动应用程序,那么您可以添加一些 JVM 参数,例如 --add-modules

如果您想知道自动和未命名的模块,这完全取决于您如何启动应用程序,are two ways how you can do that

  1. 从模块代码启动您的应用程序:

由于一个模块必须要求它的所有依赖项,并且这些依赖项只能由其他命名模块(即类路径上的 JAR 不)来满足,因此模块化 JAR 的所有依赖项都必须放在模块路径上。是的,即使是非模块化 JAR,它们也会变成自动模块。

有趣的是,自动模块可以读取未命名的模块,因此它们的依赖关系可以在类路径上。

  1. 从非模块代码启动您的应用程序:

并且由于非模块化代码不表达任何依赖关系,它不会从模块路径解析模块。

因此,如果非模块化代码依赖于模块路径上的工件,您需要使用 --add-modules 选项手动添加它们。

例如,如果您想使用 ServiceLoader.load(Foo.class); 并从非模块化代码编译应用程序,则必须将 Foo 类的提供程序模块显式添加到带有 --add-modules 的模块图中。

来自The State of the Module System的备注:

如果在命名模块和未命名模块中都定义了包,则忽略未命名模块中的包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多