【问题标题】:How to release a Maven submodule without releasing the parent POM?如何在不释放父 POM 的情况下释放 Maven 子模块?
【发布时间】:2026-01-29 18:10:02
【问题描述】:

我是一个 Java 库(ta4j,它为technical analysis 提供函数)的维护者。在我的存储库中,不同的模块已经过 mavenized,我正在尝试发布其中一个。

Maven 架构

本项目的Maven架构为:

ta4j-parent
  |__ ta4j
  |__ ta4j-examples

ta4j-父

我添加此pom.xml 只是为了在ta4jta4j-examples 之间共享一些属性(licensesissueManagement 等),以及将来的dependencyManagement。我不想发布这个工件(因为它对我图书馆的用户没用)。

ta4j

这个pom.xmlta4j-parent 作为它的父级。它包含发布 ta4j 工件所必需的内容,这是我的库中唯一有用的(它是库本身的唯一源模块)模块。

ta4j 示例

该工件包含独立的主类,其中显示了 ta4j 的使用示例。我不想发布它。

目前pom.xml 仅包含示例的依赖项。

发布

由于我只想发布ta4j 模块,所以我转到./ta4j/ta4j 子目录并运行以下命令:

mvn release:prepare -Darguments=-Dgpg.passphrase="<my key secret>"

...返回:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building ta4j
[INFO]    task-segment: [release:prepare] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [release:prepare {execution: default-cli}]
[INFO] Verifying that there are no local modifications...
[INFO]   ignoring changes on: **/pom.xml.backup, **/release.properties, **/pom.xml.branch, **/pom.xml.next, **/pom.xml.releaseBackup, **/pom.xml.tag
[INFO] Executing: /bin/sh -c cd /home/user/workspace/ta4j/ta4j && git status
[INFO] Working directory: /home/user/workspace/ta4j/ta4j
[INFO] Checking dependencies and plugins for snapshots ...
There are still some remaining snapshot dependencies.
: Do you want to resolve them now? (yes/no) no: : no
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Can't release project due to non released dependencies :
    eu.verdelhan:ta4j-parent:pom:0.4-SNAPSHOT
in project 'ta4j' (eu.verdelhan:ta4j:jar:0.4-SNAPSHOT)
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7 seconds
[INFO] Finished at: Thu May 22 21:50:50 CEST 2014
[INFO] Final Memory: 23M/293M
[INFO] ------------------------------------------------------------------------

发布插件不想发布ta4j 模块。它认为我应该首先释放快照依赖项:ta4j-parent。但是,正如我之前所说,我不希望父母被释放(......因为它对每个人都没用)。

那么我怎样才能发布ta4j 模块并且只发布ta4j 模块?

注意:我使用的 Maven 版本是 Apache Maven 2.2.1 (Java 1.7)。

谢谢。

编辑 2014-06-02

我编辑了这个问题,因为我认为我的主要问题是释放子模块而不释放其父模块。快照与否无关紧要。

【问题讨论】:

  • 你为什么使用 Maven 2 而不是 Maven 3 ?请尽快更新。其次,您的项目结构看起来错误,因为您有一个不包含重要内容的父项,例如固定插件版本等。您有包含这些内容的子模块。此外,您使用的是非常旧的插件版本(maven-gpg-plugin 1.1?)等。
  • @khmarbaise 因为 Ubuntu 12.04 LTS(这是我现在使用的系统)默认提供 Maven 2。你认为使用 Maven 3 可以解决我的问题吗?我将看看插件版本。无论如何,我的目标不是立即更新,而是发布一个版本。最后,如果子模块共享插件,我认为在父 pom 中固定插件版本的兴趣是专利,这里不是这种情况(除了 maven-compiler-plugin,但我把它放在父 pom 中)。谢谢。
  • 插件版本的固定是使您的构建可在不同的 Maven 版本上重现的一项基本工作。如果 Maven 2 是由 Ubuntu 提供的,那么使用非常旧的东西对我来说没有意义。如果你不使用你的父母来分享东西,那么你创建的结构就越来越没有意义了。

标签: java maven release snapshot maven-release-plugin


【解决方案1】:

经过几天的研究,我没有找到让父POM透明的方法。

我最终选择同时发布父模块。即使它(理论上)没有用,我也注意到这是这类项目的常见做法。

我很失望,Maven 似乎没有这样的功能(比如在子 POM 中包含父 POM)。但是,如果将来有人能找到方法,我会更改已接受的答案。

【讨论】:

  • 如何从 ta4j 的 pom.xml 中删除“父”标签
【解决方案2】:

这听起来有点奇怪,因为如果有人在 maven 中引用了 ta4j,那么 maven 会抱怨它找不到 ta4j-parent,除非你也提供了它。如果您要让父级可用,那么最好给它一个发布版本而不是快照版本。

也就是说,您可以通过设置 ignoreSnapshots 属性来告诉 maven 忽略快照,即

mvn release:prepare -DignoreSnapshots=true -Darguments=-Dgpg.passphrase="<my key secret>"

【讨论】:

  • 这被认为是非常糟糕的做法™。依赖于快照的东西不应被视为生产就绪。
  • @Markus 是的,我同意,我很惊讶发布插件竟然有这个选项。
  • 感谢您的回答。确实,按照你的说法,这听起来很奇怪。我不知道 Maven 会抱怨它找不到 ta4j-parent。显然这不是我要找的。我同意@Markus,因为这是一种不好的做法。但我不想让 ta4j 依赖于任何快照。我更多地考虑使用 effective pom 而不是真正的 pom(例如like in the help plugin)并使父工件透明的 Maven 选项。仍在调查,但谢谢你们。 :)