【问题标题】:Improve performance of ivy resolve提高常春藤解析的性能
【发布时间】:2013-07-13 11:00:46
【问题描述】:

从纯 ant 迁移到 ant+ivy 后,我的项目构建时间从 7 秒增加到 26 秒,而增量重建现在是 7 秒,而不是不到 1 秒(几乎是瞬间)。

大部分时间似乎都花在ivy:resolve 上,我需要使用ivy:cachepath 生成类路径。

有什么方法可以加快速度,尤其是重建?

【问题讨论】:

  • 增加缓存 ttl 有很大帮助 - 重建时间降至 2 秒。我想额外的一秒钟只是常春藤的低效率。出于某种原因,完整构建(带有填充缓存)是 20 秒。请创建一个我可以标记的答案。
  • 我认为您不必在每次构建时都运行ivy:resolve,就在依赖项发生变化时?我将resolve 与很少手动运行的install 构建目标分开。 cachepath 仍然是 4s

标签: ant ivy


【解决方案1】:

另一个选项是关闭基于网络的分辨率并强制 ivy 使用缓存数据。

查看以下答案了解更多详情:

【讨论】:

    【解决方案2】:

    你在使用<ivy:cleancache>吗?这就是为什么您的重建时间如此之短,而您的初始构建却如此之长的原因。

    Ivy 会比在没有 Ivy 的情况下使用 Ant 慢。 Ivy 必须先下载您指定的每个 jar,以及所有依赖项到 Ivy 缓存中(在 Unix/Mac/Linux 上默认为 $HOME/.ivy2/cache,在 Windows 上默认为 %USERPROFILE%\.ivy2\cache),然后才能开始。您可以指定 4 或 5 个罐子,但这些罐子可能取决于其他罐子,而其他罐子可能会更多。

    确实没有办法加快 Ivy 下载 jars1,但是一旦下载了 jars,确实没有理由每次都不断清理 Ivy 缓存你做一个新项目,或者当你做一个干净的时候。

    你可以做的是设置你的清理,这样你就可以避免清理常春藤缓存除非你指定它

    <taskdef uri="http://ant.apache.org/ivy"
        resource="org/apache/ivy/ant/antlib.xml">
        <classpath>
            <fileset dir="${ivy.dir}">
                <include name="ivy*.jar"/>
            </fileset>
        </classpath>
    </taskdef>
    
    <property name="ivy.cleancache"   value="false"/>
    <target name="clean">
        <if>
            <istrue value="${ivy.cleancache}"/>
            <then>
               <ivy:cleancache/>
            </then>
        <if>
        <delete dir="${target.dir}"/>
    </target>
    

    这样,运行ant clean 不会每次都清理您的 Ivy 缓存,您可以一遍又一遍地重复使用它。如果你想清理 Ivy 缓存,你需要这样做:

    ant -Divy.cleancache=true clean
    

    是的,这是使用antcontrib。我使用我的特殊 Ivy 目录配置来为每个人配置 Ivy,并且在我这样做的时候,包括 ant-contrib 的定义,以及 Findbugs、PMD 和其他有用的工具。

    但是,在 Ant 1.9 中可能不必这样做:

    <property name="ivy.cleancache"   value="false"/>
    <target name="clean">
        <ivy:cleancache if:true="ivy.cleancache/>
        <delete dir="${target.dir}"/>
    </target>
    

    我还没有尝试过,但如果它有效,你就不必使用 antcontrib。当然,你也可以这样做:

    <target name="ivy.cleancache"
       if="ivy.cleancache">
       <ivy:cleancache/>
    </target>
    
    <target name="clean"
        depends="ivy.cleancache">
        <delete dir="${target.dir}"
    </target>
    

    那么你可以指定:

    $ ant -Divy.cleancache clean
    

    清理您的 Ivy 缓存,只需输入 ant clean 即可清理您的构建而不清理 Ivy 缓存。


    1. 如果您使用自己的 Maven 存储库(如 Nexus 或 Artifactory),您可能能够加快 jar 的下载速度。这些将有自己的缓存,将下载的第三方 jar 存储在本地。这比在网络外查找这些第三方 jar 包要快一些,但仍然需要下载它们。也许不是需要 26 秒,而是可能只需要 20 秒。

    【讨论】:

    • 我通常会创建两个干净的目标“clean”和“clean-all”,后者依赖于前者并运行 ivy cleancache 任务。我认为更简单,并且不需要第 3 方“ant-contrib”库。否则我赞同这个答案。缓存(ivy 和 Nexus)提高了性能。
    • @MarkO'Connor 正如我所说,我有一个特殊的Ivy Directory 项目,开发人员包括它,它配置了 Ivy 所需的一切。作为奖励,我添加了一大堆有用的第三方插件,包括 ant-contrib。同样作为一部分,javac.macro 显示所有警告,jar.macro 自动将 pom.xml 添加到 jar 中,就像 Maven 喜欢的那样。但是,我给出的最后两种方法确实向您展示了如何在没有 Ant-contrib 的情况下做到这一点。
    • 我的立场是正确的。我必须更详细地查看你的 github 项目,谢谢!
    • @MarkO'Connor 稍微坦白一下。我们将build.xml 设置为在构建中自动执行&lt;ivy:cleancache&gt;除非开发人员设置build.propertiesivy;cleancache=false。我们的默认设置是清理 ivy 缓存,开发人员可以自行设置不这样做。这个想法是 Jenkins 可以进行全新的结帐,无需其他配置,点击all 目标并为构建做所有事情。这个想法是在项目中配置所有内容。任何带有 JDK、And 和 SVN 的 PC 都可以构建任何项目而无需进一步设置。
    • 我默认不使用 cleancache,因为它会破坏缓存点。我很感兴趣你在哪里找到关于任务级别 if:true 的信息? if 命名空间是什么?
    【解决方案3】:

    试试这个-Divy.checkmodified=false / -Divy.skip=true

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 2013-08-17
      • 2011-08-19
      • 2011-04-05
      • 2011-03-18
      • 2013-05-31
      • 2015-10-28
      • 2016-12-31
      相关资源
      最近更新 更多