Как собрать модуль отдельно в многомодульном проекте maven?

Следуя maven-ci-friendly статье в официальной документации Maven, был создан этот многомодульный проект ( минимальный пример).

Есть три модуля и корневой проект (начало):

/inception
  /modules
    /base     (common parent of 'core' and 'facade')
    /core     (child of 'base')
    /facade   (child of 'base' having 'core' as a dependency)

Выполнение mvn package из inception работает как положено — все 3 *.jar артефакта создаются в соответствующих target папках.

Я хотел бы иметь возможность сборки модуля facade отдельно. К сожалению, mvn package from modules/facade не может собрать зависимости и завершается с ошибкой

[ERROR] Failed to execute goal on project sample-facade:
        Could not resolve dependencies for project sample.group:sample-facade:jar:0.0.1:
        Failed to collect dependencies at sample.group:sample-core:jar:0.0.1: 
        Failed to read artifact descriptor for sample.group:sample-core:jar:0.0.1:
        Could not transfer artifact sample.group:sample-base:pom:${revision}

Поверхностная проблема заключается в том, что ${revision} не превращается в 0.0.1.


Не могли бы вы помочь мне решить эту проблему?

Отвечает ли это на ваш вопрос? Модули Maven + создание отдельного конкретного модуля

Zinc 12.12.2020 11:44

@Zinc Спасибо за ссылку. Но это не подходит к проблеме, которая возникает из-за неразрешенного свойства revision.

diziaq 12.12.2020 12:07

Может быть это ваша проблема. Какую версию maven вы используете?

Zinc 12.12.2020 12:14

Отвечает ли это на ваш вопрос? Проблема Maven для сборки одного модуля с использованием свойства ревизии

Brian Tompsett - 汤莱恩 12.12.2020 12:23

@Zinc Это maven 3.6.1+, как описано в минимальном примере README github.com/diziaq/sample-maven-modular-revision

diziaq 12.12.2020 12:26

@BrianTompsett-汤莱恩 yes

diziaq 12.12.2020 12:29

Очень важно прочитать документацию по ci до конца и добавить flatten-maven-plugin, который не является частью вашего pom... Кроме того, в вашем примере отсутствует родительский элемент, потому что у вас есть один уровень каталога без файла pom github .com/diziaq/sample-maven-modular-revision/tree/main/… ... что означает, что все подмодули должны быть перемещены на один уровень вверх в иерархии каталогов...

khmarbaise 12.12.2020 13:24

@khmarbaise Большое спасибо. Да, flatten-maven-plugin это ключ. Но иерархия каталогов на проблему не влияет — проект можно построить с заданной структурой. Единственным предварительным условием является установка core и base в локальном репозитории maven перед вызовом package на facade.

diziaq 12.12.2020 13:37

Если вам нужно install, то ваша сборка сломана... структура каталогов является одной из проблем. Это облегчит вам работу ... Почему facadebase является родителем? а не уровнем выше? И настроить все в корне github.com/diziaq/sample-maven-modular-revision/blob/main/… ? Вы, кажется, неправильно поняли многомодульную сборку....

khmarbaise 12.12.2020 15:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
648
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

flatten-maven-plugin решает проблему. Спасибо @khmarbaise, который посоветовал в комментариях дочитать документы до конца.

Добавление плагина в /modules/base/pom.xml решило проблему с отдельной сборкой подмодуля:

 <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>flatten-maven-plugin</artifactId>
    <version>1.2.5</version>
    <configuration>
      <updatePomFile>true</updatePomFile>
      <flattenMode>resolveCiFriendliesOnly</flattenMode>
    </configuration>
    <executions>
      <execution>
        <id>flatten</id>
        <phase>process-resources</phase>
        <goals>
          <goal>flatten</goal>
        </goals>
      </execution>
      <execution>
        <id>flatten.clean</id>
        <phase>clean</phase>
        <goals>
          <goal>clean</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Перед началом фазы модуля facade необходимо иметь base и core в локальном репозитории, чтобы maven мог найти артефакты. Следовательно, вот последовательность действий в root:

  • mvn install -pl modules/base,modules/core (или просто mvn install)
  • mvn package -pl modules/facade

Я рекомендую документы, потому что я их написал... ;-)

khmarbaise 12.12.2020 15:49

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