maven-release-plugin 目标在多模块项目的子模块中被忽略

maven-release-plugin goals ignored in submodule in multi-module project

我有一个多模块 Maven 项目。项目布局如下

project/
  pom.xml

  types/
    pom.xml

  client/
    pom.xml

  service/
    pom.xml

typesclient 模块构建为 JAR,service 构建为 WAR。我正在使用 maven-release-plugin 创建该项目的新版本。我 喜欢 让发布插件在执行 service 模块的发布时调用额外的目标。

发布插件在根 pom 中配置如下(没什么特别的):

<plugin>
  <artifactId>maven-release-plugin</artifactId>
  <version>2.5.3</version>
</plugin>

... 并在 service pom 中像这样配置以及我试图通过 <goals> 参数调用的插件:

<plugin>
  <artifactId>maven-release-plugin</artifactId>
  <configuration>
    <goals>deploy dockerfile:build dockerfile:push</goals>
  </configuration>
</plugin>

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>dockerfile-maven-plugin</artifactId>
  <configuration>
    <repository>12345.ecr.us-east-1.amazonaws.com/project</repository>
  </configuration>
</plugin>

我的想法是,我想为 service 模块构建一个 Docker 图像,但为项目中的其他模块构建图像没有意义。但是,在切割新版本时,永远不会调用 service pom 文件中的目标配置。

Maven 版本:3.3.3

maven-release-plugin: 2.5.3

JDK:Oracle 1.8.0u144

正在使用的命令:

mvn -Pstaging -B clean release:clean release:prepare release:perform

我无法共享此命令的输出。

我已确认相关配置似乎已通过

应用
mvn -Pstaging help:effective-pom 

我的问题是:发布插件是否可以实现我想要实现的目标?我没有发现任何表明这是不可能的问题或文章。

请注意,我从未使用过 dockerfile-maven-plugin,请尝试发布配置文件而不是目标。

第 1 步。在 project/pom.xml 中编辑发布插件配置。

<plugin>
  <artifactId>maven-release-plugin</artifactId>
  <version>2.5.3</version>   <!-- should define in pluginManagement -->
  <configuration>
    <releaseProfiles>publish-docker</releaseProfiles>
    <!-- other plugin config -->
  </configuration>
</plugin>

为配置文件选择一个有意义的名称。我将使用 publish-docker 作为此处的名称。

第 2 步。将具有该名称的配置文件添加到 service/pom.xml

<profiles>
  <profile>
    <id>publish-docker</id>
    <build>
      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>dockerfile-maven-plugin</artifactId>
        <configuration>
          <repository>12345.ecr.us-east-1.amazonaws.com/project</repository>
        </configuration>
        <executions>
          <execution>
            <id>docker-publish</id>
            <phase>deploy</phase>  <!-- important -->
            <goals>
              <goal>build</goal>
              <goal>push</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </build>
  </profile>
</profiles>

此配置文件包括将 dockerfile:builddockerfile:push 目标绑定到 deploy 阶段的插件配置。发布插件将为每个模块启用 publish-docker 配置文件。该配置文件将仅存在于 service 模块中,因此它将 运行.

我注意到另一件事。在发布命令中:

mvn -Pstaging -B clean release:clean release:prepare release:perform

我怀疑 -Pstaging 部分在发布期间并未实际应用。发布插件为每个目标分叉另一个进程 运行。要将参数传递给 fork,需要 arguments 参数:

mvn -Pstaging -Darguments="-Pstaging" -B clean release:clean release:prepare release:perform