maven仅部署更改的工件

时间:2009-12-07 14:28:03

标签: maven-2 deployment nexus

我正在使用maven 2.2和nexus 1.4.0

假设我有一个像这样的pom结构(带有相应的版本)

parentproj, v1.0.1
 - childproj1, v1.0.2
 - childproj2, v1.0.7

childproj1和childproj2代表应用程序的不同部分(例如gui和backend),我希望能够将它们的版本分开,以便我可以发布新版本的后端,而无需发布新版本的gui

现在,要将此结构部署到Nexus,可以方便地转到parentproj并说

  

mvn deploy -DperformRelease = true

将所有工件部署到Nexus realease存储库。我第一次部署它时工作正常,但第二次遇到问题:让我说我对childproj1进行了更新,以便我们现在有以下版本:

parentproj, v1.0.1
 - childproj1, v1.0.3
 - childproj2, v1.0.7

在这种情况下,Nexus不允许我从parentproj进行mvn部署,因为它已经拥有1.0.7版本中的childproj2副本。 Nexus会说“资源,非法请求:ID ='版本'的存储库不允许更新工件。”这很好,我不想错误地更新现有版本。

但我想我想要做的就是能够告诉maven类似于“仅部署那些版本尚未存在于发行版库中的工件”。

有没有办法做到这一点,还是我必须自己部署每个项目?

5 个答案:

答案 0 :(得分:3)

根据我的经验,部署所有内容变得更加容易,并且通常对所有组件使用相同的版本号。例如,如果我的团队正在使用版本1.0.7,则所有子模块的版本号均为1.0.7-SNAPSHOT,直到我们发布,即使某些模块中没有更改代码。然后在部署时,我们将部署整个应用程序。我认为它比零碎的部署有几个优点。首先,如果你必须回滚到最后一个稳定版本,你只需要回滚到所有模块的1.0.6 - 你不必记住后端是1.0.3而GUI是1.0.6。其次,它确保所有组件相互正确编译,并作为逻辑组进行测试。

对不起,我知道这不是你问题的具体答案,但是,至少在我的团队的情况下,思考方式略有不同

答案 1 :(得分:3)

首先,我认为你应该区分父项目和聚合项目。父项目应该用于几个项目共有的那些设置,例如:依赖的版本;应该使用聚合项目,以便同时建立一组项目,例如一套罐子和包含它们的战争。

这两种项目最好保持分开。父项目通常不会经常更改,一旦发生,通常最好发布所有依赖它的项目的新版本;聚合项目的唯一目的是驱动一堆项目的构建,因此只要其中包含的项目之一需要发布,它的版本号就应该改变。

一旦您将父级与聚合器分开,您就可以更好地选择是否遵循John Paulett的建议并将所有内容保留在相同的版本号中,或者仅在实际需要发布时尝试更改每个项目的版本号它。第一个选项更简单,更不容易出错,但会导致您发布未更改的新版本库。例如,如果您需要发送补丁而不是完整版本,则可能无法接受。第二种选择更复杂且容易出错,但会使您的版本号与软件的发展相匹配。 Maven发布插件和Jenkins持续集成工具可能会有帮助,我认为你应该检查它们。另外,看看你是否可以将Maven升级到至少2.2.1版本,将Nexus升级到更新版本。

答案 2 :(得分:1)

我建议如果您计划独立维护,构建和部署模块,则应考虑为每个模块设置单独的CI和mvn deploy作业。拥有独立的mvn deploy工作将为您提供开箱即用的行为。这意味着不使用聚合器pom(parentprj)来尝试构建和部署这些模块。

如果你想从聚合器pom中做所有事情,比如构建和部署,那么我建议按照John的回答并保持所有版本号同步。

这取决于您的团队希望如何查看代码库。如果你想以真正的模块化方式保存东西,你应该使用你的maven模块,比如构建块,对它们进行不同的处理,直到你准备将整个应用程序放在一起。如果您的应用程序本质上更加单一,请将其视为如此并保持同步。这并不意味着您仍然无法打破单独的maven模块来维护基于代码的模块化,只是认识到它们在较大的应用程序的上下文之外没有任何价值。

做出此决定的一个好方法是问自己“其他任何项目/应用程序是否需要将此模块作为依赖项?”。如果是这样,最佳做法是独立构建,版本和部署它。如果没有,我认为没有任何陷阱使版本匹配。

答案 3 :(得分:1)

显然,maven没有解决这个需求,Nexus或者archiva都没有解决这个问题。 目前它只能通过构建管理器设置的其他技巧来解决,就像以前的帖子中建议的那样。

在理想的世界中

  • pom包括
      。模块的发布版本和快照版本
      。文件的定义,如果更改,则证明使用快照版本的合理性   。已发布模块的源代码管理系统参考

  • 依赖模块poms会在相应的依赖关系部分中添加快照版本信息旁边的发布版本信息,以便链接到快照库(如果存在于repo和发布库中)

  • maven reactor可以选择读取依赖关系层次结构和文件更改信息(scm diff),以了解是否要在其版本或快照版本中使用给定模块。

    < / LI>
  • 发布插件默认会跳过释放模块,这些模块仍然可以根据文件更改和依赖项信息与其发布版本一起使用。

答案 4 :(得分:1)

我建议您使用Artifact Exists Maven插件(https://github.com/chonton/exists-maven-plugin)。只需在parent.pom上提及这一奇妙的事情,它就会自动跳过存储库(Nexus或Artifactory)中已经存在的所有发行工件的安装和部署阶段。并且仍然部署快照(可配置)。

示例:       

  <plugin>
    <groupId>org.honton.chas</groupId>
    <artifactId>exists-maven-plugin</artifactId>
    <version>0.0.6</version>
    <executions>
      <execution>
        <goals>
          <goal>remote</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

</plugins>