【问题标题】:Use the latest snapshot of dependency?使用最新的依赖快照?
【发布时间】:2014-02-06 02:51:18
【问题描述】:

更新:简化我的问题 - 我有一个模块 mod1,它用作模块 mod2 中的依赖项。我想确保 mod2 始终使用 mod1 的最新版本快照。如何在 Maven 中实现这一点?

=================

我有两个模块,其中一个模块用作另一个模块的依赖项。如何确保 mod1 的最新快照始终在 mod2 中使用?这两个模块在父 pom 中都提到如下 -

<modules>
   <module>mod1</module>
   <module>mod2</module>
</modules> 

我在远程 maven repo(版本 1.0)上有一个 mod1 的发布版本。现在,在我的构建中,当 mod1 中有代码更改时,它被构建为 1.1-SNAPSHOT(未部署在远程仓库上)。如何确保 mod2 使用此(最新)快照版本?如果 mod1 源已更改,则需要在 mod2 中使用新版本 1.1-SNAPSHOT,如果 mod1 没有更改源,则需要在 mod2 中使用现有的最新版本 1.1。谁能建议如何在这里始终使用最新的快照/版本?我尝试在 pom.xml 中关注 mod2 -

<dependency>
   <groupId>com.test</groupId>
   <artifactId>mod2</artifactId>
   <version>LATEST</version>
</dependency>

但是,这始终会解析为发布版本 1.0,而永远不会解析为本地存储库中的 1.1-SNAPSHOT。如何确保使用最新的快照?将不胜感激任何建议。

【问题讨论】:

    标签: maven maven-2 maven-3


    【解决方案1】:

    -SNAPSHOT 版本已经包含了“最新”的概念。

    所以我们的发布周期需要如下所示:

    在开始之前,你有:mod1 版本是1.0-SNAPSHOT,mod2 版本是1.1-SNAPSHOT,它依赖于mod1:1.0-SNAPSHOT

    现在你想释放。为此,您需要在任何地方删除 -SNAPSHOT,然后构建和部署。

    在部署之后,你会增加版本:

    mod1 版本现在是1.1-SNAPSHOT,mod2 版本是1.2-SNAPSHOT,它依赖于mod1:1.1-SNAPSHOT

    您永远不会遇到 snapshot 版本的 mod2 依赖于 release 版本的 mod1。

    【讨论】:

      【解决方案2】:

      我确实找到了解决方案。在依赖项下,添加以下工作 -

      <version>[1.0-SNAPSHOT,)</version>
      

      如果快照不存在,它会选择最新版本,这是我需要的。

      【讨论】:

      • 永远不要使用版本范围,因为这会使您的构建不可预测且不可重现。
      • 这真的取决于您的使用情况和设置方式。这使我可以按照我在问题中解释的那样做我想做的事情。我很想解释当与 Jenkins 一起使用时,我如何仍然可以使我的构建可预测和可重现,但这将是这个问题的主题。
      【解决方案3】:

      通常,同一项目中的模块使用相同的版本,根本不指定模块中的版本。在这种情况下,Maven 将使用父版本。

      使用该设置,mod2/pom.xml 可以有这样的东西:

          <dependency>
              <groupId>com.test</groupId>
              <artifactId>mod1</artifactId>
              <version>${project.version}</version>
          </dependency>
      

      在这种情况下,您根本不需要将mod1 安装到本地存储库。

      只需从顶级目录运行mvn 命令,mod2 将能够毫无问题地解析mod1。 Eclipse 和 Idea 也将正确处理此设置。

      如果您有特定的用例需要安装 mod1,或者您需要两个模块具有不同的版本号,请解释一下,因为这可能有助于更好地回答您的问题。

      最后,您可能会发现Versions plugin 很有用。它可以管理您的项目、插件和依赖版本,并根据需要进行升级。

      【讨论】:

      • 谢谢。如果我始终保持与 mod2 相同的 mod1 版本,那么您的建议会奏效。但是,我确实需要能够保留两者的不同版本。 mod1 也被多个其他模块使用。对于构建,mod2 可能已经更改而 mod1 没有更改,在这种情况下 mod1 不会构建,因此仍然会有早期版本,需要在 mod2 pom.xml 中引用。但是,如果 mod1 与 mod2 一起更改,那么它们都将使用相同的新版本(1.1-SNAPSHOT),在这种情况下,我需要确保 mod1 的 1.1-SNAPSHOT 在 mod2 pom 中使用。可能吗?
      • 我不确定这是否可能。您最好的选择可能是使用版本插件管理 mod1 依赖版本的 mod2 的 pom.xml。使用 LATEST 或类似的东西是不好的做法,因为构建永远不会稳定。根据您的 cmets,您应该不需要将资源安装到本地存储库,您应该可以从顶级目录编译。
      猜你喜欢
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 2021-02-16
      • 2014-11-16
      • 2017-02-22
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      相关资源
      最近更新 更多