Maven如何使用Java 9模块?

时间:2018-04-11 09:46:17

标签: maven java-9 jigsaw

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

1 个答案:

答案 0 :(得分:3)

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

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

如果您想了解自动和未命名的模块,那么取决于您启动应用程序的方式,are two ways how you can do that

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

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

         

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

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

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

           

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

           

      例如,如果您想使用ServiceLoader.load(Foo.class);并从非模块化代码编译应用程序,则必须将Foo类明确的提供程序模块添加到模块图中,并使用{{ 1}}。

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

        

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