这个常春藤变化模式/快照配置有什么问题?



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

<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-938和https://issues.apache.org/jira/browse/IVY-1221,包括所有的评论,和AFAICT(也许不正确!)没有一个解决方法是相关的。

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

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

我使用Nexus,但以下内容也适用于Artifactory。下面的设置文件设置了Maven Central和我的两个托管存储库(Maven存储库有两种风格,release或snapshot):

<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从开发构建(或快照)中分离发布的哲学。这也解释了Maven的一个非常笨拙的方面……发布工件的两种不同方式…

我怀疑你想做的是沿着作者的路线,即设置CD管道线。在这种情况下,每个构建都是一个潜在的版本,应该这样对待(没有快照允许的动态依赖)。

我建议将快照限制为仅针对开发人员的构建。只部署发布候选版本。这种方法的问题在于管理大量的发行版。一些存储库管理器(Nexus, Artifactory, Archiva)提供了"分期"功能,可以证明或丢弃没有通过质量闸门的版本。

<标题>更新2 h1> 果你正在使用ivy将快照发布到Maven存储库中,那么有几个问题:
  • Ivy不支持发布带有时间戳的快照
  • Ivy不更新Maven模块的metadata.xml文件

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

有解决这些问题的方法:

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

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

经过几天的斗争…

问题是对于

checkmodified="true" changingMatcher="regexp"

要在上工作,它必须在层次结构行中的每个解析器上都是 -所有父解析器和底部的解析器。

相关内容

  • 没有找到相关文章

最新更新