Apache Ivy buildnumber 非常缓慢

Posted

技术标签:

【中文标题】Apache Ivy buildnumber 非常缓慢【英文标题】:Apache Ivy buildnumber painfully slow 【发布时间】:2013-07-11 03:16:42 【问题描述】:

使用buildnumber 计算 ant 构建脚本内的新版本号时,ivy 将在计算下一个版本时挂起长达 20 分钟。随着构建数量的增加,它似乎呈指数级增长(我正在测试的项目大约有 600 个)。一开始我以为可能是大文件和哈希检查的原因,但后来我打开调试,看了大约 1200 次:

[ivy:buildnumber] using ssh to list all in /Storage/ivy/status/base//module/version [ivy:buildnumber] SShRepository:list called: /Storage/ivy/status/base//module/version [ivy:buildnumber] found 12 urls [ivy:buildnumber] 0 matched /Storage/ivy/status/base//module/version/[artifact]-version.jar

由于某种原因,它正在遍历每个目录以查找某个 jar 文件,当它找不到它要查找的内容时,它会转到第二个解析器并再次尝试。当然它永远不会找到匹配项,因为任何目录中都没有 jar。

ivysettings 文件如下所示:

<ivysettings>
        <property name="ivy.checksums" value="" />
        <property name="tisivy.host" value="builds.example.com" />
        <property name="tisivy.url.path" value="http://$tisivy.host" />

        <property name="tisivy.file.path" value="/Storage/ivy" />
        <property name="tisivy.repo.pattern" value="[module]/[revision]" />
        <property name="tisivy.artifact.pattern" value="$tisivy.repo.pattern/[artifact]-[revision].[ext]" />

        <settings defaultResolver="url-chain" />

        <caches/>

        <resolvers>
                <chain name="url-chain" returnFirst="true">
                        <url name="http">
                                <ivy pattern="$tisivy.url.path/status/$tisivy.repo.pattern/ivy.xml" />
                                <artifact pattern="$tisivy.url.path/status/$tisivy.artifact.pattern" />
                        </url>
                </chain>

                <ssh name="ssh" user="example" userPassword="****************" host="$tisivy.host" publishPermissions="0644">
                        <ivy pattern="$tisivy.file.path/status/$tisivy.repo.pattern/ivy.xml" />
                        <artifact pattern="$tisivy.file.path/status/$tisivy.artifact.pattern" />
                </ssh>
        </resolvers>

        <triggers>
        </triggers>

        <statuses>
                <status name="production" integration="false" />
                <status name="integration" integration="true" />
                <status name="status" integration="false" />
        </statuses>

        <modules>
        </modules>

</ivysettings>

对内部版本号的调用如下所示: &lt;ivy:buildnumber organisation="org" module="$ivy.module.doubleslash" revision="$version.base" /&gt;

我似乎找不到其他人遇到这个问题,所以我确定我在某个地方犯了错误。

【问题讨论】:

【参考方案1】:

我通常会告诉buildnumber 任务使用哪个解析器:

<ivy:buildnumber resolver="url-chain"
                 organisation="$ivy.organisation" 
                 module="$ivy.module" 
                 revision="$version.base"/>

文档描述了默认行为是如何搜索所有可用的解析器。 (这是有道理的,您发布到的 repo 可能不在默认解析器设置中)。

注意事项:

我使用 ivy.organisationivy.module 变量,因为它们是从我的 ivy 文件的“信息”标签自动设置的。

【讨论】:

我理解为什么它同时使用两个解析器。我将其设置为使用 http,然后使用 ssh 作为后备(他们都在查看同一个存储库)。问题实际上是为什么它要搜索一个我从未告诉它查找的 .jar。如果我只是告诉它只使用 http 可以将时间缩短一半,但是要花 10 分钟才能找到最大的数字仍然很荒谬。 @user2576621 链中不包含 ssh 解析。它检查两者的原因是因为这是默认行为(如解释的那样)。至于寻找一个你从未告诉它查找的罐子......我不明白(你正在使用一个属性“ivy.module.doubleslash”,其值在问题中未指定)。最后,使用 HTTP 协议搜索总是更快,每个模块查找的 SSH 连接的设置成本非常昂贵。显然,某种连接池会使这更有效,但我真的不明白你为什么要搜索两个存储库......

以上是关于Apache Ivy buildnumber 非常缓慢的主要内容,如果未能解决你的问题,请参考以下文章

Artifactory+Ivy 缺少神器 org.apache

Apache Ant 和 Ivy:生成了错误的依赖项

Apache IVY 到 Maven:MakePom 任务

无法从 eclipse 项目构建路径中的 apache ivy 依赖项导入类

我不知道如何使用 Apache Ivy

Apache IVY 到 Maven:排除工件的错误?