Java 拥有';mvn部署';在哈德逊';s构建目标和发布的标准方法

Java 拥有';mvn部署';在哈德逊';s构建目标和发布的标准方法,java,maven-2,hudson,release,release-management,Java,Maven 2,Hudson,Release,Release Management,我用构建目标mvn clean deploy site:site为我的项目设置了Hudson,每到午夜和任何时候有新的更改时运行一个构建 我一直想知道的一件事是,我是否应该在构建目标中包括deploy,因为如果我刚刚发布了项目的1.0.0版(我已经将pom更改为1.0.0版并提交了),但几天内还没有将版本号增加到1.0.1-SNAPSHOT,我可能会在不同的时间部署多个不同的1.0.0版本 但是我看到人们在Hudson的构建目标中使用了deploy——我想知道他们是如何处理这个问题的 用Mave

我用构建目标mvn clean deploy site:site为我的项目设置了Hudson,每到午夜和任何时候有新的更改时运行一个构建

我一直想知道的一件事是,我是否应该在构建目标中包括
deploy
,因为如果我刚刚发布了项目的1.0.0版(我已经将pom更改为1.0.0版并提交了),但几天内还没有将版本号增加到1.0.1-SNAPSHOT,我可能会在不同的时间部署多个不同的1.0.0版本

但是我看到人们在Hudson的构建目标中使用了
deploy
——我想知道他们是如何处理这个问题的


用Maven发布的正确方法是什么?谢谢你的指点

您应该继续从Hudson进行夜间自动部署,但是关于如何处理版本号和发布的更大问题与您的源代码控制系统有着错综复杂的联系。您没有提到您使用的是哪种源代码控制系统,但我可以解释如何使用Subversion实现这一点

首先,出于您提到的原因,您应该永远不要将主干中源代码的版本标识符更改为快照版本以外的任何版本(例如,末尾带有
-snapshot
)。否则,您将在重新部署时覆盖。最佳做法是(暂时)将主干pom中的版本标识符更改为您想要发布的版本,标记主干,从标记生成,然后部署从标记生成的生成,然后立即在主干中增加快照版本标识符,最后使用较新版本提交主干,更高的快照版本号

如果这看起来像是一个麻烦,那么您应该知道,通过依赖来完成源代码管理系统的工作,将自动为您完成所有这些

虽然我逐渐喜欢调用Hudson的Maven发布插件,但这是一件非常棘手的事情。为了使其正常工作,以下是一些提示:

  • 真正的版本需要由Hudson执行,但开发人员可以 当然也从他们的角度来做 开发机器来测试 发布过程。一定要 删除Subversion中的任何标记和任何 在Nexus中释放工件 后来
  • 它使用maven scm插件,而该插件又需要外部 要安装的subversion的安装版本 在当前路径上。因此,版本 颠覆也必须已经发生了 缓存所需的凭据 写入subversion源代码 存储库
  • 如果发布过程中途中止,您可以执行以下操作: 释放:回滚以修复POM,但是 这不会消除任何伪造的标签 已经承诺 颠覆。这些你必须 执行svn后手动删除 更新
  • release:rollback目标有时不返回pom.xml 版本返回到快照。如果 如果有什么问题,检查POM 确保使用“快照”的版本
  • release:rollback目标有时不返回SCM URL 回到他们原来的位置。如果 如果出现任何问题,请检查这些 指向“trunk”或源代码 分支机构
  • 因为我们使用Subversion,我们对maven发布插件的配置使 {{suppressCommitBeforeTag}}选项 这样就消除了一个额外的提交 其他人会修改trunk pom.xml吗 在重新修改文件之前,请先删除这些文件
还要注意的是,有一个,但并不需要从Hudson调用Maven发布插件目标,它只是让它更容易,然而,我已经让该插件工作了

因此,总结一下:

  • 仅使用从主干部署 快照
  • 使用Maven版本 插件,用于在 释放

  • 希望这能有所帮助。

    关于更改版本和从标签部署-这似乎与我在其他地方读到的最佳实践相矛盾:标签是最终版本,因此,标签中不应发生任何更改。部署/发布时,maven会在生成的jar文件中包含修订号。因此,如果在标记中更改版本并部署,则需要首先提交标记中的任何更改,然后发布并部署。不应该这样吗?这取决于你的源代码管理系统。如果您没有更改标记中的版本号,那么您可能必须在trunk中更改它,commit,tag,然后立即修复trunk中的版本,再次commit-从而在trunk pom中留下一些愚蠢的额外提交。谢天谢地,使用Subversion,您可以从本地修改的主干中进行标记!这就是我们在商店里通过Maven发布插件的suppressCommitBeforeTag选项所做的。这样,标签就不会被触碰,在主干POM中也没有额外的提交…一切都正常工作。