【问题标题】:Maven: dynamic specification of dependenciesMaven:依赖项的动态规范
【发布时间】:2012-04-18 12:48:03
【问题描述】:

我已经开始学习Maven,有以下问题:

我想动态指定构建 maven 项目的依赖项,而不是使用 POM 中指定的依赖项 - 有没有办法做到这一点?

所以虽然我在 POM 中指定了以下依赖项

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

我想在构建命令中指定我想使用不同的版本。 有没有办法指定这个?

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

谢谢!

可能的解决方案:我最终得到的是使用 ${my.lib.version} 构造并在调用 mvn 时使用 -Dmy.lib.version=1.0-SNAPSHOT" 指定它。因此,我可以将它用于 Jenkins 集成构建,方法是从 svn 获取依赖项的任意快照版本并将其快照版本提供给集成构建 pom。

【问题讨论】:

  • 你想要动态依赖的意图是什么?你能再解释一下吗?
  • @khmarbaise 我的想法是,我希望在 Jenkins 中进行集成构建,并依赖于特定分支的系统最新可用快照。该快照尚未发布到 maven 存储库,所以我想在 Jenkins 中获取它并为 mvn build 指定一个依赖项。
  • 最好的解决方案是使用 SNAPSHOT 版本来达到这个目的。
  • @khmarbaise 这也是我最初的想法,但是如果没有发布,我无法将 pom 的依赖更新到 SNAPSHOT 版本。

标签: maven-3


【解决方案1】:

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

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

因此,如果您创建一些配置文件,您可以在它们之间切换(参见 maven 参考)

例子:

<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>

【讨论】:

  • 谢谢!您是否有机会知道是否有一种方法可以从命令行为 mvn 的依赖项提供值?或者它需要弄乱poms?
  • 传递系统属性 "mvn clean test -Dmy.lib.version=1.0-SNAPSHOT" 虽然你可以这样做,但它可能是个坏主意,因为它很容易强制项目使用任意版本的只需覆盖此属性即可获得依赖项。
  • @Kal 谢谢,这正是我决定要做的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我在寻找类似的东西时偶然发现了这个。在我的情况下,相同的应用程序代码在不同的堆栈上被重用,这意味着使用不同的“驱动程序”来访问数据。尽管驱动程序实现了相同的接口,但它们确实来自不同的工件。

    【讨论】:

      【解决方案4】:

      不,您不能动态更改依赖项。此外,它没有任何意义,因为您希望有一个可重现的构建。

      【讨论】:

      • 实际上你可以,如果你在 pom 中有一个写成 ${my.lib.version} 的依赖项,你可以像 -Dmy.lib.version=1.0-SNAPSHOT" 一样指定它
      • 这将使您的构建无法重现。在我看来这是不行的。
      猜你喜欢
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2020-12-11
      相关资源
      最近更新 更多