在 Maven 版本中忽略 $project.version:prepare

Posted

技术标签:

【中文标题】在 Maven 版本中忽略 $project.version:prepare【英文标题】:Ignore $project.version in Maven release:prepare在 Maven 版本中忽略 $project.version:prepare 【发布时间】:2021-04-27 08:34:01 【问题描述】:

我们的项目在构建服务器中一个接一个地构建。它们将来可能会成为一个多模块项目,但目前还没有能力重组存储库、项目等并引入新的父 POM。

我们尝试使用类似的结构

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>de.something</groupId>
  <artifactId>project1</artifactId>
  <version>9.0.2-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>de.something</groupId>
      <artifactId>project2</artifactId>
      <version>$project.version</version>
    </dependency>

  </dependencies>

</project>

不幸的是,maven 发布插件(更具体地说,release:prepare 目标)在此失败,因为它认为依赖项是 SNAPSHOT 依赖项。

有什么办法(除了将所有东西都重建为多模块)告诉 maven 发布插件这不是这种情况吗?

类似

$project.version没事,别担心” 或“不要检查 project2 的 SNAPSHOT”

【问题讨论】:

另一种方法是完全摆脱 Maven 的发布功能,而是利用 $revision 属性,稍后可以通过构建管道使用 -Drevision=3.2.1 设置该属性。这需要使用 flatten 插件来实际解析 pom 中的版本,并允许 Maven 上传和下载工件。 This blog post 总结了这个过程,甚至提供了一个比 flatten-plugin 更快的替代方案 我的假设是project2版本不是9.0.2-SNAPSHOT?我假设该版本类似于“X.X.X”(但不是 SNAPSHOT)。所以我建议将没有 SNAPSHOT 的文字版本放入其中.. @khmarbaise 问题是:应该使用相同的版本构建多个项目(例如在多模块项目中),因此我们需要一个属性。 我已经完全理解并期望该要求,但是如果您保留该属性,则发布插件将检查该属性并将失败...发布期间的依赖项不允许成为不属于一部分的快照反应堆的情况正是如此。因此,您必须先发布 project2,然后才能发布 project1,不幸的是,除了重组为您已经提到的多模块之外,我没有看到任何其他选择,目前这是不可能的... 【参考方案1】:

“解决方案”如下:

在 POM 中定义一个属性&lt;dep.version&gt;$project.version&lt;/dep.version&gt; 并使用它来代替$project.version。 在构建到下一个发布版本(并提交)之前,使用版本 maven 插件更新属性 $dep.version。 进行构建 运行版本插件将值$dep.version重置回$project.version

【讨论】:

以上是关于在 Maven 版本中忽略 $project.version:prepare的主要内容,如果未能解决你的问题,请参考以下文章

Maven 依赖管理版本在传递依赖中被忽略

Maven 依赖管理版本在传递依赖中被忽略

Eclipse/Idea 忽略了 Maven Java 版本配置

Eclipse/Idea 忽略了 Maven Java 版本配置

Git中.gitignore忽略文件(maven项目)

Maven 发布插件 - tagBase 被忽略