如何获取常春藤:缓存路径位置,而不检查是否下载了依赖项

时间:2016-09-04 05:23:29

标签: java ant ivy

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

此任务在必要时下载常春藤(init-ivy实际上这样做),然后调用常春藤下载依赖项。它将jersey.classpath设置为结果。

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

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

1 个答案:

答案 0 :(得分:3)

正如本回答中所解释的,常春藤每次运行都不会下载罐子。它在“〜/ .ivy2 / cache”下将它们本地缓存:

其次,你在内联模式下使用常春藤,大概是为了避免创建ivy file?常春藤cachepath被归类为post resolve任务,这意味着它将在后台自动调用resolve任务。内联模式的作用是告诉ivy每次执行一个新的解决方案,如果你有多个类路径需要管理,那就太浪费了。

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

以下是常春藤的标准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任务正在使用常春藤configurations对常春藤文件中的依赖项进行分组或分类。这实际上是能够节省单个分辨率时间的效率魔法。
  • 注意 install-ivy 任务如何进行条件检查以确定是否安装了常春藤。由于复杂性,这个技巧对于项目的其余依赖项是不可行的。我的建议是确保常春藤存在,然后用它来管理其他一切。 (在引擎盖下它会尽力提高效率)。我真的不明白为什么Apache Ant没有捆绑常春藤罐。