我们正在将主要构建过程从ant转换为maven。我们将TeamCity用于持续集成服务器(CI)。
我们希望使用CI服务器启动(每晚)版本包含内部版本号的版本,如1.0.0.build#。这些构建将安装在我们的本地maven存储库中,供其他项目使用。因此CI服务器将管理版本,maven将构建项目,maven存储库将使构建可供其他项目访问。
我打算使用以下命令从CI服务器启动构建:
mvn -Dversion=1.0.0.25 install
项目的pom会有一个伪造的版本号,-D标志会覆盖它,如:
<version>0.0.0.0</version>
此方法的问题是maven安装插件仅使用pom文件中的版本,而不是命令行传入的版本。这在this maven issue中注明。
因此,自2006年8月以来这个问题已经存在并且尚未修复,我认为这不是' maven way '。所以我的问题是,如何在持续集成的情况下使用maven在存储库中安装版本化工件?
答案 0 :(得分:6)
听起来您想要使用唯一版本构建SNAPSHOT版本。
因此,在您的POM中将版本声明为:
<version>#.#.#-SNAPSHOT</version>
然后,在POM的 distributionManagement 部分中,为 snapshotRepository 启用唯一版本(请参阅Maven的POM reference):
<snapshotRepository>
<uniqueVersion>true</uniqueVersion>
<id>your-snapshot-repo-id</id>
<name>Your Snapshots</name>
<url>http://your-snapshot-repo-url/maven</url>
</snapshotRepository>
仅供参考,请注意Maven conventions推荐版本被声明为major.minor.revision。所以,1.0.25而不是1.0.0.25。如果你能够使用这个版本控制方案,那么在Maven世界中,事情会更顺利。
答案 1 :(得分:5)
Matthew's answer提供了一个解决方案,其中工件上传到具有所需版本号的本地和远程存储库,即存储库中的路径包含正确的版本号,但是,Maven始终安装和部署源POM文件仍然包含版本元素中的${ciVersion}
。
如果你有一个像这样的共同父母的多模块:
<project xmlns="..." xmlns:xsi="..." xsi:schemaLocation="...">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>myParent</artifactId>
<groupId>com.stackoverflow</groupId>
<version>${ciVersion}</version>
</parent>
<artifactId>myChild</artifactId>
...
</project>
您将无法引用myChild
模块的专用版本,因为依赖项解析将存在错误,无法找到版本为myParent
的{{1}}模块
但是,您可以使用将{POM}上传到本地和远程存储库的resolve-pom-maven-plugin,其中POM中的所有变量都会被其实际值替换。为此,您必须将以下代码段添加到(父)POM中:
${ciVersion}
答案 2 :(得分:4)
Shek的答案可能是“maven方式”,所以我会接受它作为正确答案。但是,我们还没有准备好改变我们的约定,所以这是我们正在使用的解决方法。
通过使用间接级别,您可以在构建时将版本号传递到pom,并让安装和部署插件使用它们。例如:
<project xmlns="..." xmlns:xsi="..." xsi:schemaLocation="...">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>stackoverflow</artifactId>
<version>${ciVersion}</version>
<packaging>jar</packaging>
<name>StackOverflow</name>
<properties>
<ciVersion>0.0.0.0</ciVersion>
</properties>
...
</project>
我们无法直接覆盖$ {project.version}。因此,我们添加第二个名为“ciVersion”的属性,并在属性部分中为其指定默认值“0.0.0.0”。现在,CI服务器可以通过覆盖命令行上的ciVersion属性来指定版本号。如:
mvn -DciVersion=1.0.0.25 install
安装和部署插件将使用在引用$ {project.version}时传递的ciVersion属性的值,如预期的那样,并且在命令行上未提供任何版本时将使用默认值。这使我们可以切换到maven,对我们的流程影响最小。此外,这种解决方法不引人注目,可以在需要时轻松切换到SNAPSHOT功能。