2012-01-26 80 views
3

我有一个相对较大的具有模块依赖关系链的maven项目,我试图通过Jenkins自动完成构建过程,该过程使用版本号上传模块jar文件。在这样做的时候,如果没有为命令行maven调用指定参数,我仍然希望模块具有默认的版本号(默认为0.0.0.dev)。具有相同版本号的Maven依赖关系链

我第一次尝试<version>0.0.0.dev</version>确定我可以用maven命令行覆盖此值。事实证明,情况并非如此:http://jira.codehaus.org/browse/MINSTALL-30。有一条评论引导我进行下一次尝试:<version>${build.number}</version>,我会将内部版本号传递给命令行。显然,因为该属性没有设置在其他地方,如果没有构建编号提供,我会得到诸如module.name - $ {build.number} .jar之类的jar。简单修复:如评论建议,添加<properties><build.number>0.0.0.dev</build.number></properties>

当我尝试将该版本传播到模块依赖关系时,会导致传递性问题。假设我有moduleA取决于moduleB取决于moduleC,我要求每个有相同的版本号。依赖的例子:在moduleA的POM文件:

<dependency> 
    <groupId>groupID</groupId> 
    <artifactId>moduleB</artifactId> 
    <version>${version}</version> 
</dependency> 

运行mvn compile –Dbuild.number=9.9.9.9上moduleA:它会寻找moduleB-9.9.9.9.jar,但它会寻找moduleC-0.0.0.dev.jar。这是因为build.number属性不是可传递的(不像实际的版本号)。

我的问题:我如何获得所需的行为?由于没有在命令行上传递额外的参数,因此使用默认版本号构建一个jar,但允许以该模块针对具有相同版本的其他模块的方式覆盖该默认值。

+0

模块和依赖在Maven中有非常明确的含义。命令行***上的属性将传播***到当前反应堆中正在构建的所有模块。 'moduleB'是'ModuleA'的依赖项和模块还是只是依赖项? – Dev

回答

2

只有一个例外,您不能将属性传播到依赖项的pom中。对于所有意图和目的,依赖关系的pom在安装/部署到本地/远程存储库时是固定的。如果通过反应堆解析依赖关系(即将依赖关系作为当前构建的一部分构建),那么命令行属性会在它正在构建时传播到该依赖关系。