如果我的项目中有所有类型的模块(应用程序,自动和未命名),Maven将如何使用它们? 我是否可以强制Maven将某些jar视为自动模块,而其他模块则保留在classpath中。如何使用Maven逐步迁移到模块系统?
答案 0 :(得分:3)
Maven只管理您的依赖项(jar)。如果依赖项是java模块,它并不关心它。
Maven可以提供帮助的唯一方法是,如果您通过Maven启动应用程序(例如mvn spring-boot:run
),那么您可以添加一些JVM参数,例如--add-modules
。
如果您想了解自动和未命名的模块,那么取决于您启动应用程序的方式,are two ways how you can do that:
由于模块必须要求其所有依赖项,并且那些只能由其他命名模块(即类路径上不是JAR)来实现,因此模块化JAR的所有依赖项必须放在模块路径上。是的,即使是非模块化的JAR,也会变成自动模块。
有趣的是,自动模块可以读取未命名的模块,因此它们的依赖关系可以在类路径上进行。
由于非模块化代码不表示任何依赖关系,因此它不会从模块路径解析模块。
因此,如果非模块化代码依赖于模块路径上的工件,则需要使用
--add-modules
选项手动添加它们。例如,如果您想使用
ServiceLoader.load(Foo.class);
并从非模块化代码编译应用程序,则必须将Foo
类明确的提供程序模块添加到模块图中,并使用{{ 1}}。
来自The State of the Module System的注释:
如果在命名模块和未命名模块中都定义了包,则忽略未命名模块中的包。