Maven 2 maven仅部署更改的工件

Maven 2 maven仅部署更改的工件,maven-2,deployment,nexus,Maven 2,Deployment,Nexus,我在Nexus1.4.0中使用maven 2.2 假设我有这样一个pom结构(有相应的版本) childproj1和childproj2代表应用程序的不同部分(例如gui和后端),我希望能够将它们的版本分开,这样我就可以发布后端的新版本,而不必发布gui的新版本 现在,要将此结构部署到Nexus,可以方便地转到parentproj并说 mvn部署-DPPerformRelease=true 将所有工件部署到Nexus realease存储库。在我第一次部署它时,它工作正常,但在第二次遇到问题时:

我在Nexus1.4.0中使用maven 2.2

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

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

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

mvn部署-DPPerformRelease=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='releases'的存储库不允许更新工件。”这很好,我不想错误地更新现有版本

但我想我想做的是能够告诉maven类似“只部署那些版本不在发布库中的工件”


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

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


对不起,我知道这不是你的问题的具体答案,但是,至少在我的团队的情况下,稍微有点不同的想法是有用的:

< P>我建议如果你计划独立地维护、构建和部署这些模块,你应该考虑设置单独的CI和<代码> MVN部署< /Cord>作业。拥有独立的
mvn部署
作业将为您提供开箱即用的行为。这意味着不使用聚合器pom(parentprj)尝试构建和部署这些模块

如果您想从聚合器pom开始做所有事情,比如构建和部署,那么我建议您遵循John的答案,并保持所有版本号的同步

这取决于您的团队希望如何看待代码库。如果你想保持一种真正的模块化方式,你应该像使用积木一样使用maven模块,以不同的方式对待它们,直到你准备好将整个应用程序组装在一起。如果你的应用程序在本质上更为单一,那么就这样对待它,并保持同步。这并不意味着您仍然无法划分单独的maven模块来维护代码基模块性,只需认识到它们在您的大型应用程序的上下文之外没有任何价值


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

首先,我认为您应该区分父项目和聚合项目。父项目应用于多个项目共有的设置,例如依赖项的版本;为了同时构建一组项目,应该使用聚合项目,例如一组JAR和包含它们的war

这两类项目最好分开。父项目通常不会经常更改,当它更改时,最好发布依赖于它的所有项目的新版本;聚合项目的唯一目的是推动一系列项目的构建,因此每当需要发布其中一个项目时,它的发布号可能会改变


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

显然,maven、Nexus和archiva都没有满足这一需求。 目前,它只能通过构建管理器设置的额外技巧来解决,就像前面文章中建议的那样

在理想世界中

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

  • 从属模块poms将在相应的从属部分中,在快照版本信息旁边添加发布版本信息,以便链接到快照库
    parentproj, v1.0.1
     - childproj1, v1.0.3
     - childproj2, v1.0.7
    
      <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>