如何简单地将特定文件附加到 Maven 构建?

问题描述

如果我只运行 Maven 目标 deploy:deploy,这将导致错误

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-cli) on project [...]: The packaging for this project did not assign a file to the build artifact -> [Help 1]

我马上就明白了。首先,我必须解释我想做什么。我的目标是这样一个有序的构建管道:

  1. 编译代码、运行测试、生成 jar 文件(基本上是一个 mvn clean package)。
  2. 运行静态代码分析。
  3. 使用第 1 步的结果组装工件(zip 存档、容器映像等)。
  4. 使用第 3 步的结果将工件部署到存储库。
  5. ...

这些步骤中的每一个都应该使用上一步的结果进一步继续构建管道,并且无需(!)重复之前的步骤。此外,一些更高的步骤不需要每次都运行。例如,对于典型的功能错误修复分支,最重要的是代码编译、测试执行和代码分析。这将为开发人员提供必要的反馈,以防他们破坏某些东西。没有必要实际组装工件,因为在某处部署它们毫无意义。仅对于少数分支(如 master)和标签,运行所有内容才有意义。

问题在于:Maven 妨碍了这一点。 Maven 总是需要运行一切。假设我做这样的事情(简化):

$ mvn clean package
$ mvn deploy

一个命令将满足步骤 1 的目标。第二个命令将执行完全相同的操作以及实际部署。

简单地说:我会编译我的代码两次。我会运行两次测试。我会创建 jar 文件两次。但是所有这些都已经用第一个命令完成了。所有 jar 文件都已经存在(在目标文件夹中)。我只是想让 Maven 来接他们。我不希望 Maven 重复第 1 步。

另外,我不想只在单个多合一构建管道步骤中运行像 mvn deploy 这样的多合一命令,因为它会阻止我将构建过程拆分为逻辑步骤.但是,我仍然喜欢使用 deploy 插件,因为它可以根据版本号和分发管理配置来决定它必须使用哪个存储库(快照或发布)。我不想在我的构建脚本中“重新实现”那个逻辑。因此,deploy:deploy-file 不是一个选项,因为该目标无法做到这一点。

这就是为什么我要寻找一种方法来用这样的东西替换第二个命令 (mvn deploy):

mvn clean deploy:deploy

这只会运行实际部署。问题:之前的阶段没有运行。这就是我收到错误的原因(我在上面向您展示过)。

不幸的是,Maven 忽略了目标文件夹中准备就绪的 jar 文件,并因无法找到工件错误而中止。 Maven 似乎只识别在前几个阶段执行期间内部附加的工件。

对于其他目标也是如此,例如 mvn spring-boot:repackage,属于 assemble 步骤的类型。所以我必须找到一个通用的解决方案。我希望有一种方法可以以某种方式(手动)附加文件以及 mvn deploy:deploy 之类的命令,这样我就不需要多余地执行之前的阶段。

你知道如何解决这个问题吗?

有没有办法从指定阶段恢复构建?

是否有替代插件,谁能帮忙?

开箱即用:使用 Gradle 是否更容易解决这个问题?

解决方法

Maven 旨在调用 mvn clean deploy 并在构建期间执行所有操作。

我知道拆分构建步骤确实有好处(更容易掌握错误发生的位置),但 Maven 不支持这一点。