4

更新快照依赖项时,我无法让 Ivy 更新缓存。解析器(具有以下设置:

<url name="xxx" m2compatible="false" 
     checkmodified="true" changingMatcher="regexp" 
     changingPattern=".*-SNAPSHOT.*">

一个示例工件文件名(在 Artifactory 中)是:

my-jar-1.999-SNAPSHOT.jar

详细的 Ant 解析日志包括:

[NOT REQUIRED] com.myorg#my-module;1.999-SNAPSHOT!my-jar.jar

工件上没有 POM。

解析器位于链式解析器下方;他们都有所有相关的属性集。我已阅读https://issues.apache.org/jira/browse/IVY-938https://issues.apache.org/jira/browse/IVY-1221,包括所有评论和 AFAICT(可能不正确! ) 没有任何变通办法是相关的。

我应该放弃快照而只使用具有“integration.latest”动态版本依赖的显式版本吗?我担心当我们为多个主要版本进行集成构建时,这可能最终会失败。那时,我们需要将主要版本拆分到单独的存储库中,或者将主要版本号放在工件名称中,或者同样笨拙的东西,只是为了使“integration.latest”工作。

4

2 回答 2

5

在与 Maven 存储库管理器交谈时,我不喜欢使用 url 解析器。问题是 Maven 对快照修订有特殊且相当独特的处理...... url 解析器更适合用于 ivy 存储库。

我使用 Nexus,但以下内容也应该适用于 Artifactory。以下设置文件设置 Maven Central 和我的两个托管存储库(Maven 存储库有两种风格,发布或快照):

<ivysettings>
    <settings defaultResolver="repos" />
    <resolvers>
        <chain name="repos">
            <ibiblio name="central" m2compatible="true"/>   
            <ibiblio name="my-releases" m2compatible="true" root="https://myhost/releases"/>   
            <ibiblio name="my-snapshots" m2compatible="true" root="https://myhost/snapshots"/>   
        </chain>
    </resolvers>
</ivysettings>

您会注意到我正在使用具有内部逻辑的ibilio解析器来破译 Maven 的特殊快照处理。

当我需要快照修订时,我认为明确声明如下:

<ivy-module version="2.0">
    <info organisation="myOrg" module="Demo"/>
    <dependencies>
        <dependency org="myOrg" name="myModule" rev="2.7-SNAPSHOT"/>
        ..
    </dependencies>
</ivy-module>

在后台, ibilio解析器正在读取 Maven 存储库元数据文件,以确定应该从快照存储库中获取哪个带时间戳的工件。

更新

我建议阅读以下演示文稿:

它很好地概述了将发布与开发构建(或快照)分开的 Maven 哲学。它还解释了 Maven 非常笨拙的方面之一......发布工件的两种不同方式......

我怀疑您正在尝试做的是按照作者的思路,即设置 CD 管道。在这种情况下,每个构建都是一个潜在的版本,应该这样对待(没有快照允许的动态依赖关系)。

我建议将快照限制为仅限开发人员构建。仅部署候选版本。这种方法的问题在于管理大量的发布。一些存储库管理器(Nexus、Artifactory、Archiva)提供“暂存”功能,可以验证或丢弃未通过质量关卡的版本。

更新 2

如果您使用 ivy 将快照发布到 Maven 存储库中,那么有几个问题:

在我看来,时间戳文件首先是使用快照的杀手级功能之一。使用 ivy 只能提供最新的文件(覆盖以前的最新文件)。

有一些变通方法可以解决这些问题:

  1. 正如第二个链接中所建议的,您可以完全忽略元数据(将“useMavenMetadata”属性设置为false)并默认返回到常春藤比较文件名的旧机制。这只解决了常春藤客户的问题。
  2. 存储库管理器应该能够重新生成元数据文件(Nexus 至少有一个任务来执行此操作)。
  3. 使用 Maven ANT 任务。

最后一个建议并不像看起来那么疯狂。首先,这是我知道的唯一支持时间戳快照的方法,其次,Maven 客户端似乎做了很多额外的处理(更新模块元数据),这些处理基本上没有记录。

于 2013-01-21T19:20:59.870 回答
3

经过几天的挣扎...

问题是对于

checkmodified="true" changingMatcher="regexp"

要在 <resolver> 上工作,它必须在层次结构行中的每个解析器上 - 所有父 <chain> 解析器和底部的 <url>、<local> 或 <ibiblio> 解析器。

于 2013-01-25T15:32:49.657 回答