Maven 如何与 Java 9 模块一起工作?

Zim*_*ger 6 maven java-platform-module-system java-9

If I have all types of modules in my project (application, automatic and unnamed) how exactly Maven will work with them? Can I enforce Maven to treat some jars as automatic modules whereas other modules to stay in classpath. How to gradually migrate to module system with Maven?

And*_*sha 4

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

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

如果您想知道自动和未命名模块,这完全取决于您启动应用程序的方式,有两种方法可以做到这一点

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

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

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

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

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

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

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

模块系统状态的注释:

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