【问题标题】:Managing multiple internal projects using Maven (Switching from ant/ivy)使用 Maven 管理多个内部项目(从 ant/ivy 切换)
【发布时间】:2011-04-14 09:44:21
【问题描述】:

让我先解释一下我们的基础架构。

我的公司生产两种企业软件产品(每个产品又包括多台服务器)。让我们称他们为ProductAProductB

ProductA 由 40 个单独的项目组成,这些项目分支在一起,但都是单独构建的,并被视为单独的单元。由于这些项目中的每一个都创建了一个大型依赖关系树,因此我们使用 Ivy/Ant 来管理我们的依赖关系。 TeamA 不断修改所有这些项目,有时以向后不兼容的方式进行,因此我们将所有内容发布到 ivy,作为(示例)1.0.0.SVN_REV。当我们依赖某些东西时,我们会说 1.0.0.+ 并使用冲突解决程序来为我们提供一组兼容的依赖项。

想象一个像这样的依赖图:

W -> X -> Y
       \
        -> Z
       /
     V

当我们的顶级项目依赖于W 1.0.0.+V 1.0.0.+ 时,我们可能无法获得最新的V,因为最新的W 可能尚未使用最新的Z 构建,因此 Ivy 会驱逐最新的V,使用1.0.0.9 而不是1.0.0.10,因为最新的WV 1.0.0.9 都依赖于Z v1.0.0.6 所有这些构建都由Bamboo 驱动,并配置了依赖项以在必要时启动子构建,并且因此,这些项目中的每一个都是单独构建的。

因此,在这种设置下,Ivy 保证我们所有顶层构建的依赖项都是二进制兼容的。现在,顶层构建可能需要最新的V 才能正确编译,因此会因编译错误而失败,但如果编译成功,我们就会知道所有依赖项都是二进制兼容的,而 QA 不会花点时间安装 8 个服务器,发现 W 调用 Z 时缺少某些方法。

ProductB 利用了其中大约 30 个项目,但它不会采用最新的项目,而是等待 ProductA 的 QA 团队对发布进行认证,然后开始使用这些依赖项。

Maven 将如何为ProductB 工作是相当明显的,因为它们总是依赖于一组不变的依赖关系。

所以,要找到问题的症结,在评估 Maven 时,我看到 SNAPSHOT 依赖项和发布如何为我们提供基本结构。但是,我不知道或不明白的是,Maven在发布W时是否会修改POM,以填写所使用的显式SNAPSHOT,还是只是说W依赖于X-1.0.0-SNAPSHOT ?

如果它不能完全替换使用的 X,我如何才能获得 Ivy 给我的相同二进制兼容保证?

唯一明显的答案是使用一个巨大的构建来完成所有 40 个项目,但是当顶级项目是唯一的变化时,这将需要相当长的时间来构建。如果 über 编译需要 30 分钟,我可能会看到每个构建有 5-10 次提交,这将很难评估哪个开发人员破坏了构建。 所以基本上,我正在寻找与此不同的解决方案。

【问题讨论】:

    标签: maven-2 ant ivy


    【解决方案1】:

    当 ivy 发布到存储库时,可以选择指定发布版本

    <ivy:publish resolver="shared" pubrevision="1.0" status="release">
       <artifacts pattern="dist/[artifact].[ext]" />
    </ivy:publish>
    

    ivy 的优点在于它会生成并发布一个“ivy.xml”,该文件将在发布时解析所有动态版本号。这一切你可能已经知道了。

    令人惊讶的是,Maven 需要做更多的工作。您将需要可以在本地编辑您的 POM 的插件(如果您有子模块,它们的 POM 也是如此)。更多详情请看以下插件

    因此,在调用“mvn deploy”之前,您需要确保您的 POM 是洁净的。

    说实话,我并没有完全放弃基于 ivy 的构建,因为我发现很难模仿 ivy 对动态模块相互依赖性的轻松支持。我确信这是可能的,就像我说的那样,当您习惯使用 ivy 时,这似乎需要更多的工作。

    为了简化从 ivy 到 Maven 的过渡,您是否考虑过使用 ivy 生成模块 POM?以下对我来说非常有效:

    <ivy:deliver deliverpattern="dist/ivy.xml" pubrevision="1.0" status="release"/>
    <ivy:makepom ivyfile="dist/ivy.xml" pomfile="dist/pom.xml">
        <mapping conf="default" scope="compile"/>
        <mapping conf="runtime" scope="runtime"/>
    </ivy:makepom>
    

    deliver 任务将解析​​所有动态依赖项并创建一个 ivy 文件,该文件可用于生成 maven POM。然后这个 POM 会与您的模块标准工件一起发布,并且需要在 ivy 文件中指定:

    <ivy-module ..
    ..
        <publications>
             <artifact name="mymod" type="war" conf="master" />
             <artifact name="pom"   type="pom" ext="xml" conf="master" />
        </publications>
    

    确保您使用的是 ivy 2.2.0 版本,并且标准的 ivy 发布任务(见上文)在上传您的工件和生成的 POM 时应该没有问题

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 2013-04-20
      • 2012-05-31
      • 2011-09-08
      • 1970-01-01
      • 2012-11-08
      • 2012-11-09
      • 2012-02-14
      • 1970-01-01
      相关资源
      最近更新 更多