我们正在将主要构建过程从ant转换为maven.我们将TeamCity用于持续集成服务器(CI).
我们希望使用CI服务器启动(夜间)版本,其版本包含内部版本号,如1.0.0.build#.这些构建将安装在我们的本地maven存储库中,供其他项目使用.因此CI服务器将管理版本,maven将构建项目,maven存储库将使构建可供其他项目访问.
我打算使用以下命令从CI服务器启动构建:
mvn -Dversion=1.0.0.25 install
该项目的pom将有一个虚假的版本号,-D标志将覆盖它,如:
0.0.0.0
此方法的问题是maven安装插件仅使用pom文件中的版本,而不是命令行中传递的版本.这是在这个maven问题中注意到的.
因此,自从2006年8月以来这个问题已经存在并且尚未修复,我认为这不是" maven方式 ".所以我的问题是,如何在持续集成的情况下使用maven在存储库中安装版本化工件?
听起来你想用独特的版本构建SNAPSHOT版本.
因此,在您的POM中声明版本为:
#.#.#-SNAPSHOT
然后,在POM 的distributionManagement部分中,通过(请参阅Maven的POM参考)启用snapshotRepository的唯一版本:
true your-snapshot-repo-id Your Snapshots http://your-snapshot-repo-url/maven
仅供参考,请注意Maven约定建议将版本声明为major.minor.revision.所以,1.0.25而不是1.0.0.25.如果你能够使用这个版本控制方案,那么在Maven世界中,事情会更顺畅.
Matthew的答案提供了一个解决方案,其中工件上传到具有所需版本号的本地和远程存储库,即存储库中的路径包含正确的版本号,但是,Maven始终安装和部署仍将包含的源POM文件将${ciVersion}
在版本元素.
如果您有一个具有共同父级的多模块,如下所示:
4.0.0
myParent
com.stackoverflow
${ciVersion}
myChild
...
您将无法引用myChild
模块的专用版本,因为依赖项解析将存在错误,无法找到myParent
具有版本的模块${ciVersion}
.
但是,您可以使用resolve-pom-maven-plugin将POM上载到本地和远程存储库,其中POM中的所有变量都被其实际值替换.为此,您必须将以下代码段添加到(父)POM中:
...
com.sap.prd.mobile.ios.maven.plugins
resolve-pom-maven-plugin
1.0
resolve-pom-props
resolve-pom-props
...