Maven 2 在持续集成的情况下,如何使用maven在存储库中安装版本化的工件?

Maven 2 在持续集成的情况下,如何使用maven在存储库中安装版本化的工件?,maven-2,continuous-integration,Maven 2,Continuous Integration,我们正在将我们的主要构建过程从ant转换为maven。我们使用TeamCity作为持续集成服务器(CI) 我们希望使用CI服务器启动(每夜)版本包含内部版本号的内部版本,如1.0.0.build#。这些构建将安装在本地maven存储库中,供其他项目使用。因此,CI服务器将管理版本,maven将构建项目,maven存储库将使其他项目可以访问构建 我打算使用以下命令从CI服务器启动生成: mvn -Dversion=1.0.0.25 install 项目的pom将有一个伪造的版本号,-D标志将覆盖

我们正在将我们的主要构建过程从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>
0.0.0.0
这种方法的问题在于maven安装插件只使用pom文件中的版本,而不是命令行中传入的版本。这一点在本文中有所说明


因此,由于这个问题自2006年8月以来一直存在,而且尚未得到解决,我认为这不是“maven方式”。因此,我的问题是,在持续集成的情况下,如何使用maven在存储库中安装版本化的工件?

听起来您希望使用唯一的版本构建快照版本

因此,在POM中声明版本为:

<version>#.#.#-SNAPSHOT</version>
#.#.#-快照
然后,在POM的distributionManagement部分中,通过为snapshotRepository启用唯一版本(请参阅Maven的相关内容):


真的
您的快照repo id
你的快照
http://your-snapshot-repo-url/maven

仅供参考,请注意,建议版本应声明为major.minor.revision。因此,1.0.25而不是1.0.0.25。如果您能够使用此版本控制方案,那么在Maven世界中,事情将更加顺利。

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>
install和deploy插件将使用每当引用${project.version}时传入的ciVersion属性的值(如预期),并且当命令行上没有提供版本时,将使用默认值。这允许我们切换到maven,对流程的影响最小。此外,此解决方案不引人注目,允许在需要时轻松切换到快照功能。

提供了一种解决方案,其中工件将上载到具有所需版本号的本地和远程存储库中,即存储库中的路径包含正确的版本号,Maven总是安装和部署源POM文件,该文件在版本元素中仍然包含
${ciVersion}

如果您有一个多模块,具有如下所示的公共父模块:


4.0.0
这会将POM上传到本地和远程存储库中,POM中的所有变量都会被它们的实际值替换。为此,必须将以下代码段添加到(父)POM中:

。。。
com.sap.prd.mobile.ios.maven.plugins
解析pom maven插件
1
解析pom道具
解析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>
mvn -DciVersion=1.0.0.25 install