【问题标题】:How to handle maven versions in a multi module project?如何处理多模块项目中的 Maven 版本?
【发布时间】:2011-05-01 12:05:42
【问题描述】:

我有一个像这样的 Maven 项目基础架构:

/trunk/all/pom.xml
/trunk/all/libs/lib1/pom.xml
               /lib2/pom.xml
               ...
/trunk/all/projects/p1/pom.xml
                   /p2/pom.xml
                   ...

你看,我有很多库和很多使用这些库的项目。

所有这些都合并到一个多模块项目中,因为我喜欢

  • 将*项目导入 Eclipse 并立即使用我的所有库和项目
  • 在我进行了一些全局重构之后,只需执行一个 mvn test 即可编译和测试我的所有代码。

目前,我所有的模块都是版本1.0-SNAPSHOT

现在我想将项目p2 和所有库p2 使用(例如lib1lib2)发布到版本1.0。之后我在lib1 上做了一些代码修改,但在lib2none

我希望p2 的下一个版本是1.1 版本,在1.1 版本中使用lib1(自上一个版本以来已修改),但lib2 仍在版本1.0 中(因为它未修改)。

更笼统地说:如果我进行发布,我想增加正在发布的项目以及自上次发布以来所有更改库的次要数量。

问题

我必须自己处理所有模块版本还是有一个插件可以为我完成所需的工作?

【问题讨论】:

    标签: maven-2 maven-release-plugin


    【解决方案1】:

    我必须自己处理所有模块版本还是有一个插件可以为我完成所需的工作?

    好吧,如果您不想让各种工件(项目、库)的版本与all/pom.xml 中定义的版本保持同步(即通过整个层次结构继承它),恐怕您'将不得不开始手动管理它们。我只是不确定为什么即使您没有对其进行任何更改,您也不会更改say lib2 的版本。使用您当前的 svn 存储库结构,所有工件都有相同的发布生命周期(当您标记主干时,您将标记其中的所有内容)。

    现在,如果 p1p2(为了简单起见,我将忽略这些库)有独立的发布周期,我会推荐多个“主干/标签/分支” " 结构如this thread:

    myrepo
      + .links (2)
        + trunks
          + pom.xml
      + parent-pom (1)
        + trunk
          + pom.xml
      + project-A
        + trunk
          + pom.xml
      + project-B
        + trunk
          + pom.xml 
    

    1) 项目的父 POM 有 一个自己的发布周期。每一个 组件的 POM 将使用它作为父级 (简单引用groupIdartifactId,没有relativePath)。为了 一个版本,你必须释放 首先是父 POM。

    2) 这是一个使 轻松签出特定分支 项目的,即通常 树干。颠覆用户签出 myrepo/.links/trunk 获取头部 修订所有来源。诀窍是, 该目录包含 外部链接(即与 svn:externals 属性)到 这个所有其他模块的主干 项目(父pom,项目-A, 项目-B)。这里面的 pom.xml 目录永远不会被释放,它 仅包含一个模块部分 三个模块,使多 模块构建。有了这个构造 您可以轻松设置分支 例如:

    myrepo
      + .links
        + branch-2.x
          + pom.xml
    

    我已经多次使用过这个设置(我已经在 SO 上写过,请参阅下面的相关问题),效果很好。实际上,包括 Maven 在内的许多项目都在使用这种方法,这不是一种幻想。

    这不会解决您的“自动”版本处理(我不知道有任何解决方案),但至少,这种结构与Maven Release Plugin 配合得很好,并且会支持您的独立发布周期要求。

    另见

    相关问题

    【讨论】:

    • 在我的上一个项目中,我构建了一个命令行工具,可以让您自动递增或递减特定模块的主要、次要或递增版本,同时自动更新其他模块中的所有依赖项(它理解依赖项, 父母甚至 artifactItems)。使用起来非常有趣,但最终我们意识到我们不需要单独的模块版本,所以我们放弃了它。很好的答案顺便说一句(+1)
    • @seanizer 很有趣,虽然到目前为止我并不真正需要这种粒度。用 Groovy 写的? :)
    • 不,纯 java。也没有使用 Maven 代码。我会看看能不能找到它并把它贴在某个地方。
    • @pascal:感谢您的回答,我会重新考虑我当前的目录结构。但我认为你的建议是更多的工作来维护。使用我的结构,我在发布单个项目时标记整个结构。这就是我所要做的。模块的版本号只能让我的客户了解代码的哪一部分(哪些模块)发生了变化。
    • @tangens:不客气。我不确定您是否使用 maven-release-plugin,我的回答是面向 maven-release-plugin 的(如标签所示)。我也不确定为什么更改模块的版本号是客户关心的问题(您可能有充分的理由,但为什么不使用发行说明?)但转向手动版本管理与您的维护问题相冲突,IMO。跨度>
    【解决方案2】:

    嗨! 也许我遗漏了一些东西,但是如果您的库/模块开始觉得需要拥有自己的版本号,这是否表明它们正在成长并开始自己的生活 - 即成为独立的项目在他们自己的权利?

    意思是这样对待它们可能有意义 - 将它们视为单独的项目,推送到一些 mvn 存储库,然后作为正常依赖项添加到核心项目中?

    对不起,如果我以某种方式错过了重点,但我自己也遇到了多模块项目“问题”......也许这个问题根本不是问题?

    【讨论】:

    • 每个库都有自己的生命。我正在寻找一种自动方法来增加库的版本号,如果它自使用它的项目的上一个版本以来发生更改。关键是,我想将所有库的最新源代码与项目一起发布。