Maven发布插件未更新dependencyManagement中的SNAPSHOT依赖项

6

我有一个覆盖整个公司的父级pom文件,其中包含一个<dependencyManagement>部分,定义了在应用程序中使用的项目版本,其中一些是快照版本,类似于以下内容:

<dependencyManagement>
  <dependencies>
    ...
    <dependency>
      <groupId>my.group</groupId>
      <artifactId>myArtifact</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
    ...
  <dependencies>
</dependencyManagement>

当我在父pom上运行release:prepare时,这些SNAPSHOT不会被删除。结果是,从父级继承的项目在自己发布时无法使用其版本。我如何确保父pom的<dependencyManagement>部分在发布时更新?
我看到了这个问题:why does maven release plugin allow for SNAPSHOT version in dependency managment?,但所提及的票据声称已在插件的早期版本中修复。
Maven Release Plugin 2.3.1
Apache Maven 3.0.4 (r1232337; 2012-01-17 08:44:56+0000)
Java version: 1.6.0_31, vendor: Sun Microsystems Inc.
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

给定的依赖项是否是您的反应堆的一部分? - khmarbaise
不,这种情况下并不是这样的。父POM中没有声明任何模块,因为它被用于多个不同的项目。这样做的想法是将所有项目共有的东西集中起来,例如存储库、元数据等。这会有所不同吗? - Conan
那么,你真正的问题是什么?
  • 你无法发布自己的项目吗?
  • 你想要插件条带快照,就像在JIRA中提到的那样?
- Jean-Rémy Revy
我可以成功发布父项目,只是在其<dependencyManagement>部分中有SNAPSHOTs。问题在于,当我来发布从它继承的项目时,它将继承这些SNAPSHOT版本 - 发布插件无法意识到这一事实,导致发布不可靠。 - Conan
2个回答

1

所以你正在尝试发布不属于你正在准备的构建的工件?如果你执行了relase:perform,如果它们不存在,插件应该上传哪些工件到存储库?(如果它们存在,为什么要放置快照版本?)
我认为正如@khmarbaise所说,插件不会删除不属于您反应堆的SNAPSHOTS(插件可能认为它们是第三方依赖项)。

这是一条评论,我将其作为答案发布,因为我还没有足够的声望来发布评论...对我的英语表示抱歉!


是的,在这种情况下,我只发布一个带有“pom”打包的父级构件。此时我期望上传的唯一构件是父级pom。当实际发布特定的包含代码的项目时,它将继承已发布的父级,并使用其<dependencyManagement>部分中定义的版本;如果它们包含SNAPSHOT,则我的发布处于可疑状态,我不能保证它在未来是可重用的。 - Conan
作为一种解决方法,如果发布的目的只是替换依赖管理中的SNAPSHOT并提交到SCM,那么您应该尝试手动执行这个过程(或者最好制作一个批处理程序),不要手动更改每个项目的版本,来吧,不要放弃!尝试像这样做(在.bat文件中):sed -i 's/-SNAPSHOT//g' pom.xml; cvs commit pom.xml。您可以使用GnuWin进行sed功能,或者更好地开始使用Linux! - Pablo Lascano

1

maven-release-plugin 只关心您的 <dependencies/> 部分是否有 SNAPSHOT 版本。 <dependencies/> 将被所有扩展此父级的模块继承。在构建之前,它们将始终尝试解析这些依赖项。

<dependencies/><dependencyManagement/> 部分之间的区别在于后者仅定义将使用的版本。也就是说,发布插件根本不关心您是否在那里定义了 SNAPSHOT 版本,除非此父项目是聚合器或聚合器的一部分,并且此父级与聚合器一起发布。

同样,maven-release-plugin 不会处理 <pluginManagement/>。此外,我认为它仅在这些与 <dependencies/> 相关的 Maven 属性包含工件版本时才进行处理。

更糟糕的是 - 据我所记得 - 如果依赖项/插件具有 SNAPSHOT 版本,并且它位于 <*Management/> 部分中,则您甚至不会收到警告。

因此,我采用的方法是使用包含工件版本的<properties/>的父POM。在发布之前,我会使用grep扫描其中的SNAPSHOT
grep SNAPSHOT pom.xml

我实际上已经在父POM中的<properties>部分定义了版本,然后在<dependencyManagement>部分引用。我希望在单个pom中定义所有内部项目的版本为快照,并将所有版本信息从各种项目的pom中排除。然而,这需要父POM在dependencyManagement中指定发布版本,所以我想这不会起作用。我想我必须将版本信息移动到每个不同的项目中,这很遗憾。我希望在发布过程中避免手动更改版本。 - Conan
1
让我感到惊讶的是,当我发布一个特定的项目,该项目从父级的<dependencyManagement>部分继承版本时,它不会抱怨SNAPSHOT。似乎如果在被发布的pom中没有提到这些版本,那么发布插件就会让它们通过而不是提示删除SNAPSHOT。 - Conan
1
我很遗憾<dependencyManagement>会以这种方式运作,但看起来这是设计上的问题,所以我接受了这个答案。感谢您的反馈! - Conan
很不幸,有时候即使遵循规范的代码也有其限制和预料之外的用途(在编写时)。您可以在JIRA中提交更改请求或错误报告:http://jira.codehaus.org/browse/MRELEASE。 - carlspring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接