常春藤在本地之后不会从遥控器下载jar

时间:2015-01-07 14:10:41

标签: java maven ant build ivy

我将常春藤配置为第一个maven本地回购然后远程。但是出了点问题! (顺便说一下,我正在使用快照)

  1. 如果常春藤缓存不存在,常春藤首先检查maven本地仓库然后远程获取所需的罐子。一切都很好。
  2. 如果常春藤缓存存在,常春藤只检查本地回购!它不检查远程!我这里有2个问题:
    • 如果我在maven项目中更改某些内容并将其安装到maven的本地存储库中,ivy仍会从其缓存中获取jar,而不是在maven的本地repo中。
    • 更糟糕的是,如果在常春藤缓存中需要jars,它就不会在遥控器中获得任何jar。
  3. 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>
    

    相关的ant任务

    <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>
    

    我该如何检查

    • 首先,本地回购,如果有变更,请从当地回购下载
    • 然后,远程,如果有更改,请从远程下载

    此处还有一种可能的情况,即如果远程和本地同时发生变化,我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

缓存的一个操作问题是,随着时间的推移它们变得很脏,特别是在共享和集成时#34;或&#34;快照&#34;生成。

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

  1. 您在两种不同的构建技术之间创建了强大的依赖关系。
  2. 您正在缓存缓存,而不是缓存存储库......由于存在脏缓存的风险,这是一种虚假的经济现象。
  3. 我的建议是通过引入像Nexus这样的Maven存储库管理器来简化一切,以便从Maven Central缓存文件和在项目构建之间共享的宿主工件。