2012-04-18 222 views
0

我已经开始学习Maven和有以下问题的动态规格:Maven的:依赖

我想动态指定用于构建Maven项目,而不是使用的POM中指定的依赖关系的依赖关系 - 有什么办法要做到这一点?

所以,虽然我在POM

... 
<dependencies> 
<dependency> 
<groupId>group</groupId> 
<artifactId>ProjectComponent</artifactId> 
<version>1.0</version> 
</dependency> 
... 

指定以下依存我想,我想用一个不同版本的内部命令来指定。 有没有办法指定它?

这个想法是,我想要在Jenkins中进行集成构建,并依赖于特定分支的系统的最新可用快照。该快照尚未发布到Maven存储库,所以我想在Jenkins中获取它并指定mvn构建的依赖项。

谢谢!

可能的解决方案:我最终得到的是打电话来MVN时使用$ {} my.lib.version建设,并指定其与-Dmy.lib.version = 1.0快照”因此我可以使用它为Jenkins集成构建,通过从svn获取依赖关系的任意快照版本并将它们的快照版本提供给集成构建pom。

+0

你有什么打算有一个动态的依赖?你能解释一点吗? – khmarbaise 2012-04-18 13:04:18

+0

@khmarbaise这个想法是,我想要在Jenkins中进行集成构建,并依赖于特定分支的系统的最新可用快照。该快照尚未发布到Maven存储库,所以我想在Jenkins中获取它并指定mvn构建的依赖项。 – Hippopotamus 2012-04-18 13:27:48

+0

最好的解决方案是使用SNAPSHOT版本来达到这个目的。 – khmarbaise 2012-04-18 13:56:57

回答

0

我最终得到的是使用$ {my.lib。版本}构造,并在调用mvn时使用-Dmy.lib.version = 1.0-SNAPSHOT指定它。因此,我可以通过从svn获取依赖关系的任意快照版本并将它们的快照版本提供给集成构建来将它用于Jenkins集成构建pom。

0

不,您不能动态更改依赖关系,而且它没有意义,因为您想有一个可重复的版本

+0

实际上,你可以,你可以指定它像-Dmy.lib.version = 1.0-SNAPSHOT“(如建议),如果你有一个依赖的书面作为$ {my.lib。版本} – Hippopotamus 2012-04-24 09:43:07

+0

这将使你的构建不可重现。在我看来,这是一个不行。 – khmarbaise 2012-04-24 10:13:44

3

Maven可以使用“动态”指定的属性(例如:group.ProjectComponent.ve rsion)在配置文件的帮助下。

<dependencies> 
    <dependency> 
    <groupId>group</groupId> 
    <artifactId>ProjectComponent</artifactId> 
    <version>${group.ProjectComponent.version}</version> 
</dependency> 

所以,如果你创建一些配置文件可能会在它们之间切换(请参阅参考资料行家)

例子:

<profile> 
    <id>stable-builds</id> 
    <properties> 
     <group.ProjectComponent.version>1.0</group.ProjectComponent.version> 
    </properties> 
    <activation> 
     <activeByDefault>true</activeByDefault> 
    </activation> 
</profile> 

<profile> 
    <id>beta-builds</id> 
    <properties> 
     <group.ProjectComponent.version>2.0.Beta1</group.ProjectComponent.version> 
    </properties> 
    <activation> 
     <activeByDefault>false</activeByDefault> 
    </activation> 
</profile> 
+0

谢谢!你有没有机会知道是否有一种方法可以从命令行为mvn提供依赖关系的值?或者它需要搞乱poms? – Hippopotamus 2012-04-18 13:33:11

+1

传递系统属性“mvn clean test -Dmy.lib.version = 1.0-SNAPSHOT”尽管可以这样做,但它可能是个坏主意,因为它很容易强制项目使用任意版本的依赖项,只需重写此属性。 – 2012-04-20 06:29:10

+0

@Kal谢谢,这正是我已经决定要做的。 – Hippopotamus 2012-04-24 09:41:14

0

刚刚遇到这个,因为我正在寻找类似的东西。在我的情况下,相同的应用程序代码正在不同的堆栈上重用,这意味着使用不同的“驱动程序”来访问数据。虽然驱动程序实现相同的接口,但他们确实来自不同的工件。