Maven 2项目版本,依赖版本和永久发布

时间:2009-04-03 17:33:10

标签: version-control maven-2

场景:系统具有多个组件,每个组件都有自己的POM。有一些长依赖链(A取决于B取决于C等)。我希望每个“非开发人员 - 桌面”构建成为潜在的候选版本 - 如果它通过QA,我们将部署它而不重建。换句话说,我从来不想将SNAPSHOT版本构建为我定期安排的版本的一部分,只有1.3.0.5,1.3.0.6等版本。我还希望让开发人员能够同时处理多个组件。

预防一些预期的建议:Maven Release Plugin对我没有帮助......除非有一些神奇的方法我可以让我的依赖版本不是POM中的SNAPSHOT,但仍然允许开发人员在多个组件上工作一旦?

我们应该如何在我们所有的POM中管理项目和依赖版本?现在它只是SNAPSHOTs到处都是,这使开发人员的事情变得简单(他们从SNAPSHOT开始,从不关心自己还要别的吗)。但是在部署时令人担忧(使用SNAPSHOT依赖的构建没有明确定义,也不可重现)。

我希望避免在构建时过度玩杂耍,但是现在我看不到任何方法。

假设我有组件util,libj,libk,APP和UI,依赖关系如下:
libj - > util(libj依赖于util)
libk - > util的
APP - > libj
UI - > libj,libk

我有开发团队在开发APP和UI,他们有时需要对某些依赖项(甚至是util)进行更改/添加,以便启用它们当前的工作。如何查看每个组件的签入POM和依赖版本?

编辑:我更新了标题以引用Maven 2而不是2.0,因为很明显我需要使用2.1或更高版本才能最好地解决这个问题。

4 个答案:

答案 0 :(得分:3)

尝试布置构建,以便需要一起开发的模块一起发布。这将让maven发布插件为您完成大部分工作。

对于真正应该具有单独生命周期的依赖项...因为它们不经常更改或由多个项目共享,所以您希望以不同方式处理它们。我这样做的方法是将依赖关系保留在最后一个发行版本,直到更改实际上需要升级到下一个快照。通过这种方式,当您去发布产品时,您会发现只需按照快照路径即可发布的所有内容。

我发现在项目的顶部pom中将外部依赖项版本指定为属性也很有帮助。这样可以一目了然地查看需要发布的内容。寻找Nexus pom的一个例子。

答案 1 :(得分:1)

这是我发现maven和内部项目非常困难的事情;你有两个版本控制系统(maven's,坦率地说,不是很好)和你的源代码控制(假设它是CVS或更好,支持真正的工作流程)。

以下是我们的工作方式:

report --depends on--> core
web    --depends on--> core

我们使用maven release plug:

报告的pom,在开发过程中,将有一个SNAPSHOT版本与核心的pom相匹配。我在核心中执行mvn clean install,然后我可以在本地环境中的report中看到这些更改。

当我发布报告时,我必须首先通过maven发布插件发布核心。当我在核心上使用它时,它要求我设置要释放的核心版本(即删除-SNAPSHOT),我说是,并且生成的已发布工件不依赖于SNAPSHOT版本。当发布插件完成后,报告pom现在取决于核心的下一个SNAPSHOT版本(尽管如果你愿意,你可以在mvn release:prepare期间覆盖它)。

然后,网络上的开发人员会收到一封电子邮件,提供新版本的核心版本,如果他们愿意,他们可以选择使用它。我们的政策是他们应该在发布前更新。

答案 2 :(得分:0)

这与需要分支他们正在处理的代码的人实际上是同一个问题。您需要某种形式的标识符才能获得特定版本,直到您合并回该组件的主线开发。

dependency classifier可能是值得研究的事情。您仍然需要让开发人员正确识别他们修改过的代码。

答案 3 :(得分:0)

我们使用“Super Parent”.pom-project,其中版本定义为属性,并且在每个child.project中,版本都使用这些属性设置

此外,真实项目没有设置版本,而是从父pom项目(包括groupId等)继承它。

通过此设置,版本仅在某些父pom项目中定义,因此所需的设置最小化

e.g。这个结构

  • super parent pom-project(作为属性定义的所有第三方版本,例如2.5.6 spring-framework) ---- persistence-parent pom-project,从超级父级继承 ------ persistence-foobar jar项目,继承所有来自persistence-parent ---- util-parent

只有您看到的版本是父关系中的版本 例如:

        <modelVersion>4.0.0</modelVersion>
<artifactId>foo-bar-foo</artifactId>
<packaging>jar</packaging>
<name>whatever</name>
<description>...</description>
<parent>
    <groupId>org.foo.bar</groupId>
    <artifactId>persistence-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>foo-bar</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>foo-bar</artifactId>
        <version>${project.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>org.springframework.jdbc</artifactId>
        <version>${parent.spring.version}</version>
    </dependency>

它以这种方式工作,因为在pom中你可以使用已定义的值,如版本,即使版本是通过继承设置的

我们将其与父项目中的模块设置相结合,以使构建更容易