使用Maven管理多个内部项目(从ant / ivy切换)

时间:2010-09-19 18:56:56

标签: maven-2 ant ivy

首先让我解释一下我们的基础设施。

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

ProductA由40个单独的项目组成,这些项目分支在一起,但都是单独构建并作为单独的单元处理。由于每个项目都创建了一个大的依赖树,我们使用Ivy / Ant来管理我们的依赖项。 TeamA 不断修改所有这些项目,有时以向后不兼容的方式进行修改,因此我们将所有内容发布到常春藤上(例如)1.0.0.SVN_REV。当我们依赖某些东西时,我们会说1.0.0.+并使用冲突解析器来获取兼容的一组依赖。

想象一下依赖图:

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

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

因此,在此设置下,Ivy保证顶层构建的所有依赖项都是二进制兼容的。现在,顶级构建可能需要最新的Z v1.0.0.6才能正确编译,因此会因编译错误而失败,但如果编译成功,我们就会知道所有依赖项都是二进制兼容的并且QA赢了当V调用W时,不会花时间安装8台服务器来查找某些方法。

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

Maven如何适用于ProductA,因为它们始终依赖于一组不变的依赖关系。

所以,来解决问题的关键,在评估Maven时,我看到ProductB依赖关系和发布如何为我们提供基本结构。但是,我不知道或不了解的是,Maven在发布SNAPSHOT时是否修改了POM,填写了所使用的显式SNAPSHOT,还是只说W取决于在W

如果它不能替换使用的确切X-1.0.0-SNAPSHOT,我怎样才能获得Ivy给我的相同二进制兼容保证?

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

1 个答案:

答案 0 :(得分:0)

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

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

常春藤的好处在于它将生成并发布一个“ivy.xml”,它将在发布时解析所有动态版本号。所有这些你可能已经知道了。

令人惊讶的是,Maven需要更多的工作。你需要在本地编辑你的POM的插件(如果你有POM的子模块)。有关更多详细信息,请参阅以下插件

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

老实说,我还没有完全放弃基于常春藤的构建,因为我发现很难模仿常春藤对动态模块相互依赖性的轻松支持。我确信这是可能的,就像我说过,当你习惯与常春藤一起工作时,它似乎更有效。

为了简化您从常春藤到Maven的过渡,您是否考虑过使用常春藤生成模块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任务将解析​​所有动态依赖关系,并创建一个可用于生成maven POM的常春藤文件。然后,此POM将与模块标准工件一起发布,并且需要在常春藤文件中指定:

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

确保您使用的是2.2.0版的常春藤,标准的常春藤发布任务(见上文)应该没有上传您的工件和生成的POM的问题