Как maven работает с модулями java 9?

Если в моем проекте есть все типы модулей (автоматические и безымянные приложения), как именно Maven будет с ними работать? Могу ли я заставить Maven обрабатывать некоторые jar-файлы как автоматические модули, тогда как другие модули должны оставаться в пути к классам. Как постепенно перейти на модульную систему с Maven?

Maven ничего не знает о модулях Java, все зависит от того, как вы обедаете свое приложение, см. Этот stackoverflow.com/questions/46288170/…

Andrew Sasha 11.04.2018 11:58
6
1
4 127
1

Ответы 1

Maven просто управляет вашими зависимостями (банками). Неважно, являются ли зависимости java-модулями или нет.

Единственный способ, которым Maven может помочь, - это если вы запустите свое приложение через Maven (например, mvn spring-boot:run), тогда вы можете добавить некоторые параметры JVM, такие как --add-modules.

Если вас интересуют автоматические и безымянные модули, все зависит от того, как вы запускаете свое приложение, там есть два способа сделать это:

  1. Запустите приложение из кода модуля:

Since a module must require all of its dependencies and those can only be fulfilled by other named modules (i.e. not JARs on the class path) all dependencies of a modular JAR must be placed on the module path. Yes, even non-modular JARs, which will then get turned into automatic modules.

The interesting thing is that automatic modules can read the unnamed module, so their dependencies can go on the class path.

  1. Запустите приложение из немодульного кода:

and because non-modular code does not express any dependencies, it will not resolve modules from the module path.

So if non-modular code depends on artifacts on the module path, you need to add them manually with the --add-modules option.

For example if you want to use ServiceLoader.load(Foo.class); and you compile your application from non-modular code you'll have to add provider module of the Foo class explicity to module graph with --add-modules.

Примечание от Состояние модульной системы:

If a package is defined in both a named module and the unnamed module then the package in the unnamed module is ignored.

Другие вопросы по теме