我正在使用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类似于“仅部署那些版本尚未存在于发行版库中的工件”。
有没有办法做到这一点,还是我必须自己部署每个项目?
答案 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>