Как собрать модуль отдельно в многомодульном проекте 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 из 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.


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


person diziaq    schedule 12.12.2020    source источник
comment
Отвечает ли это на ваш вопрос? Модули Maven + создание отдельного конкретного модуля   -  person Zinc    schedule 12.12.2020
comment
@Zinc Спасибо за ссылку. Но это не решает проблему, которая возникает из-за неразрешенного свойства revision.   -  person diziaq    schedule 12.12.2020
comment
Может быть, это ваша проблема. Какую версию maven вы используете?   -  person Zinc    schedule 12.12.2020
comment
Отвечает ли это на ваш вопрос? Проблема Maven для сборки одного модуля с использованием свойства ревизии   -  person Brian Tompsett - 汤莱恩    schedule 12.12.2020
comment
@Zinc Это maven 3.6.1+, как описано в минимальном примере README github.com/diziaq /sample-maven-modular-revision   -  person diziaq    schedule 12.12.2020
comment
@BrianTompsett-汤莱恩 да   -  person diziaq    schedule 12.12.2020
comment
Очень важно прочитать документацию ci по-дружески до конца и добавить flatten-maven-plugin, который не является частью вашего pom.... Кроме того, в вашем примере отсутствует родитель, потому что у вас есть один уровень каталога без файла pom github.com/diziaq/sample-maven-modular-revision/tree/main / ... что означает, что все подмодули должны быть перемещены на один уровень вверх в иерархии каталогов...   -  person khmarbaise    schedule 12.12.2020
comment
@khmarbaise Большое спасибо. Да, flatten-maven-plugin это ключ. Но иерархия каталогов на проблему не влияет — проект можно построить с заданной структурой. Единственным предварительным условием является установка core и base в локальное репозиторий maven перед вызовом package на facade.   -  person diziaq    schedule 12.12.2020
comment
Если вам нужно install, то ваша сборка сломана... структура каталогов является одной из проблем. Это облегчит вам работу ... Почему facade base является родителем? а не уровнем выше? И настроить все в корне github.com/diziaq/ образец-maven-modular-revision/blob/main/ ? Вы, кажется, неправильно поняли многомодульную сборку....   -  person khmarbaise    schedule 12.12.2020


Ответы (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
person diziaq    schedule 12.12.2020
comment
Я рекомендую документы, потому что я их написал... ;-) - person khmarbaise; 12.12.2020