如何获取ivy:cachepath位置而不检查是否下载了依赖项



我有一个任务在我的build.xml:

<target name="init" depends="init-ivy">
  ...
  <ivy:cachepath
      inline="true"
      module="jersey-container-servlet"
      organisation="org.glassfish.jersey.containers"
      pathid="jersey.classpath"
      revision="2.23.2" />
  ...
</target>

这个任务在必要时下载ivy (init-ivy实际上是这样做的),然后调用ivy来下载依赖项。设置jersey.classpath为结果。

现在我的build任务依赖于init任务。因此,每次构建时,它都会检查是否需要安装依赖项。我想避免每次检查依赖关系,并将buildinit分开。但是init设置了jersey.classpath, build使用了它。

是否有办法获得jersey.classpath从常春藤不要求它检查依赖关系?在这种情况下,不检查依赖关系是一个好做法吗?

正如在这个答案中所解释的,ivy并不在每次运行时都下载jar。它将它们本地缓存到"~/.ivy2/cache"下:

  • Ant下载Jar在Build

其次,你在内联模式下使用ivy,大概是为了避免创建ivy文件?Ivy缓存路径被归类为后解析任务,这意味着它会在后台自动调用解析任务。内联模式所做的是告诉ivy每次执行一次新的解析,如果要管理多个类路径,这是一种浪费。

最后你考虑过使用ivy文件吗?对resolve任务的一次调用可以遍历项目的所有依赖项,在本地缓存此信息,然后确定是否需要下载文件。我建议总是解决依赖关系。它的成本不高,并且在构建之间可能会发生变化(例如,如果您使用动态依赖项或Maven快照)。

下面是ivy的标准Ant目标:

  <available classname="org.apache.ivy.Main" property="ivy.installed"/>
  <target name="resolve" depends="install-ivy">
    <ivy:resolve/>
    <ivy:report todir='${ivy.reports.dir}' graph='false' xml='false'/>
    <ivy:cachepath pathid="compile.path" conf="compile"/>
    <ivy:cachepath pathid="runtime.path" conf="runtime"/>
    <ivy:cachepath pathid="test.path"    conf="test"/>
  </target>
  <target name="install-ivy" unless="ivy.installed">
    <mkdir dir="${user.home}/.ant/lib"/>
    <get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar"/>
    <fail message="Ivy has been installed. Run the build again"/>
  </target>

指出:

    单个名为"resolve"的目标调用ivy来管理我的项目类路径。它还为文档生成有用的报告。
  • cachepath任务使用ivy配置对ivy文件中的依赖项进行分组或分类。这是真正的效率魔法,可以在单一分辨率下节省时间。
  • 注意install-ivy任务如何使用条件检查来确定是否安装了ivy。由于复杂性,这个技巧对于项目的其他依赖项是不可行的。我的建议是确保ivy存在,然后用它来管理其他所有东西。(在引擎盖下,它会尽最大努力提高效率)。我真的不明白为什么Apache Ant不捆绑ivy jar。

相关内容

  • 没有找到相关文章

最新更新