【问题标题】:How can I tell maven to prefer SNAPSHOT versions over incremental versions?我如何告诉 maven 更喜欢 SNAPSHOT 版本而不是增量版本?
【发布时间】:2015-09-30 10:30:11
【问题描述】:

因为我的增量内部版本号 = CI 内部版本号,我不想将增量内部版本号放入我的开发 POM 中。它应该只有主要和次要版本组件。

  • POM 中的版本 = 例如1.1-快照
  • 发行版本 = 例如1.1.23

但是,同一框架内的另一个组件会说“如果本地存在 SNAPSHOT 版本,则使用该版本,否则使用最新的增量版本”。

如何在我的 POM 中指定它?

我试过了:

<dependencies>
    <dependency>
        <groupId>com.example.ajb.versionpoc</groupId>
        <artifactId>downstream</artifactId>
        <version>[1.1-SNAPSHOT],[1.1,2.0)</version>
    </dependency>
</dependencies>

但它不起作用。它仍然将版本解析为例如1.1.23。如何告诉 Maven 更喜欢 SNAPSHOT 版本?

【问题讨论】:

  • 我认为最好的方法是通过Maven Profiles
  • @DB5 我熟悉 Maven Profiles,但我认为没有办法根据特定依赖项的存在与否来触发配置文件?

标签: java maven versioning dependency-management


【解决方案1】:

我不完全理解您要做什么,但这是一般交易:

  1. 仅在开发中使用快照。 永远不要将它们放在范围内。
  2. 您的范围表达式必须包含两个参数。您有两个范围和三个范围。
  3. 仅提供稳定版本的范围。

【讨论】:

  • 嗨迈克尔,(1) 是的,我只在开发中使用快照。但是如果我不把它们放在一个范围内,我该如何解决我的问题? (2) 一个范围表达式可以包含两个或一个参数,也可以包含多个范围,见maven.apache.org/enforcer/enforcer-rules/versionRanges.html (3) 不知道这是什么意思。我不是想为快照版本设置一个“范围”,我只是想使用范围语法来实现我的目标。
  • 嗨@Tunaki,这取决于更新版本的频率。就我而言,版本必须每天在 POM 中手动更新多次,因为我们处于持续交付模型中。
【解决方案2】:

根据@DB5 对配置文件的建议,我认为您可以声明一个包含快照依赖项的特定配置文件。可以根据本地存储库中该库的存在来激活此类配置文件。

在你的 pom 的 profiles 部分添加这个片段:

    <profile>
        <!--This profile will prefer the SNAPSHOT version if it exists locally-->
        <id>local</id>
        <activation>
            <file>
                <exists>${user.home}/.m2/repository/mygroup/myartifact/myversion-SNAPSHOT/myartifact-myversion-SNAPSHOT.jar</exists>
            </file>
        </activation>
        <dependencies>
            <dependency>
                <groupId>mygroup</groupId>
                <artifactId>myartifact</artifactId>
                <version>myversion-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </profile>

    <profile>
        <!--This profile will prefer the released version if the SNAPSHOT does not exist locally-->
        <id>released</id>
        <activation>
            <file>
                <missing>${user.home}/.m2/repository/mygroup/myartifact/myversion-SNAPSHOT/myartifact-myversion-SNAPSHOT.jar</missing>
            </file>
        </activation>
        <dependencies>
            <dependency>
                <groupId>mygroup</groupId>
                <artifactId>myartifact</artifactId>
                <version>myversion</version>
            </dependency>
        </dependencies>
    </profile>

【讨论】:

  • 我理解你想要做什么,但是这个解决方案有点不稳定......(1)如果用户指定了不同的存储库位置怎么办(我过去自己也这样做过)下游团队发布相同版本的多个变体),(2)如果代码是从 IDE 中的源代码构建的,并且实际上并不存在于存储库中(这实际上是一个非常正常的用例),(3 ) 不确定这是否以独立于平台的方式工作(Windows/UNIX 路径约定)
  • 我的答案:1)您可以在配置文件中指定存储库。 2) 在这种情况下,您可以在适当的依赖项中指定 scope=system 路径。 3)为什么不呢? exists 和 missing 路径是用 Unix 表示法指定的,但我自己在 Windows 中对其进行了测试,并且工作正常。去试试吧。
  • (也许我应该回答说你的问题本身有点不稳定,但是,呃...... :-)
猜你喜欢
  • 2019-02-23
  • 1970-01-01
  • 2016-07-24
  • 2014-12-06
  • 2019-09-27
  • 2017-11-15
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多