【问题标题】:ivy doesn't download jar from remote after local本地后常春藤不从远程下载jar
【发布时间】:2015-03-05 10:58:04
【问题描述】:

我将 ivy 配置为先使用 maven 本地 repo,然后再使用远程。但是出了点问题! (顺便说一下,我正在处理快照)

  1. 如果 ivy 缓存不存在,ivy 首先检查 maven 本地 repo,然后远程获取所需的 jars。一切都很好。
  2. 如果 ivy 缓存存在,ivy 只会检查本地 repo!它不检查远程!我这里有两个问题:
    • 如果我在 maven 项目中更改某些内容并将其安装到 maven 的本地 repo,ivy 仍然会从其缓存中获取 jar,而不是从 maven 的本地 repo 中获取。
    • 更糟糕的是,如果在 ivy 缓存中请求 jar,它不会在远程获取任何 jar。

ivysettings.xml

<ivysettings>
  <settings defaultResolver="chain_resolver"/>

  <credentials host="localhost"
               realm="Sonatype Nexus Repository Manager"
               username="username" passwd="password"/>

  <property name="nexus.repo" value="url here"/>
  <property name="nexus-public" value="http://${nexus.repo}:8081/nexus/content/groups/public"/>
  <property name="m2-pattern"   value="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]"/>

  <resolvers>
    <chain name="chain_resolver">
      <ibiblio name="nexus" m2compatible="true" root="${nexus-public}"/>
      <filesystem name="local" m2compatible="true">
        <artifact pattern="${m2-pattern}"/>
        <ivy pattern="${m2-pattern}"/>
      </filesystem>
    </chain>
  </resolvers>

</ivysettings>

相关的蚂蚁任务

<target name="ivy-download" unless="offline">
    <mkdir dir="${ivy.dir}"/>
    <get src="${repo_public}/org/apache/ivy/ivy/${ivy.ver}/ivy-${ivy.ver}.jar" dest="${ivy.jar}" usetimestamp="true"/>
  </target>

  <target name="ivy-install" depends="ivy-download">
    <path id="ivy.lib.path">
      <fileset file="${ivy.jar}"/>
    </path>
    <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
    <ivy:settings file="ivysettings.xml" />
  </target>

  <target name="lib.get">
    <mkdir dir="${lib.dir}"/>
    <ivy:retrieve type="jar" conf="lib" pattern="${lib.dir}/[artifact]-[revision].[ext]"/>
  </target>

  <target name="ivy.lib.get" depends="ivy-install" if="${skipClean}">
      <antcall target="lib.get" />
    </target>

  <target name="ivy.clean.lib.get" depends="ivy-install" unless="${skipClean}">
    <ivy:cleancache/>
    <antcall target="lib.get" />
  </target>

如何查看

  • 首先,本地 repo,如果有变化,从本地 repo 下载
  • 然后,远程,如果有变化,从远程下载

这里还有一种可能的情况,就是如果remote和local同时发生变化,我该怎么办?

【问题讨论】:

    标签: java maven ant build ivy


    【解决方案1】:

    Ivy 有一个专用于该目的的本地缓存。通过避免重复下载相同的工件来提高性能。另一方面,Maven 使用其本地存储库作为缓存(Ivy 将这些概念分开)。

    缓存的一个操作问题是随着时间的推移它们会变脏,尤其是在共享“集成”或“快照”构建时。

    出于这个原因,我建议你停止将 ivy 指向 Maven 本地缓存,原因如下:

    1. 您正在两种不同的构建技术之间创建强依赖关系。
    2. 您正在缓存缓存,而不是缓存存储库....这是一种虚假的经济,因为存在脏缓存的风险。

    我的建议是通过引入像 Nexus 这样的 Maven 存储库管理器来简化一切,以便缓存来自 Maven Central 的文件和托管项目构建之间共享的工件。

    【讨论】:

    • 我正在使用nexus,但nexus 会在您部署时获取快照。在将快照安装到本地存储库以在部署之前查看代码的差异的情况下,常春藤不会从本地获取(在我的情况下),因此您必须部署。不幸的是,我必须使用 ivy 与 nexus 进行交流!当然我更喜欢 maven 但事实并非如此!
    • @AdemIlhan 让 Maven 将快照发布到 Nexus,并让 Ivy 从 Nexus 中提取它们。 Ivy 有一个有用的“latest.integration”动态修订功能,仅在从 Maven 存储库中检索时才有效。 (ibiblio 解析器可以解释与 Maven 快照相关的特殊元数据)。见stackoverflow.com/questions/8524755/…。请不要忽视 Maven 的本地存储库实际上是一个缓存的想法!它从来都不是真正的回购。 Nexus 应该是您的集成点。
    猜你喜欢
    • 2017-08-13
    • 2016-12-31
    • 2013-08-17
    • 2013-07-10
    • 2011-09-07
    • 2017-01-03
    • 2011-04-12
    • 2011-10-24
    • 2010-11-15
    相关资源
    最近更新 更多