我正在尝试编写一个从我们的存储库下载库(ivy 和 svnant)的 Ant 脚本,并将它们用作来自同一个构建脚本的 taskdef。如果所有库都存在或全部丢失,则它可以工作,但如果需要辅助库(如 svnClientAdapter),则会出现错误:
jar:file:/home/reillym/.ant/lib/svnant.jar!/org/tigris/subversion/svnant/svnantlib.xml:5: taskdef A class needed by class org.tigris.subversion.svnant.SvnTask cannot be found: org/tigris/subversion/svnclientadapter/SVNClientException
换句话说,如果主库存在或不存在,一切都很好;但是如果主库存在并且依赖库之一不存在,那么我会失败。如果没有其他任何更改,则第二次调用将成功。
我尝试从任务和具有相同结果的类中调用检测/下载任务。我的代码是:
<target name="svn-info" depends="load.subverion">
<svn><wcVersion path="${basedir}"/></svn>
</target>
<target name="load.subversion" depends="download.antlib-svn">
<taskdef resource="org/tigris/subversion/svnant/svnantlib.xml">
<!-- needed in case one of libraries was missing from ant's classpath -->
<classpath>
<pathelement location="${user.home}/.ant/lib/svnClientAdapter.jar"/>
<pathelement location="${user.home}/.ant/lib/svnant.jar"/>
<pathelement location="${user.home}/.ant/lib/svnjavahl.jar"/>
</classpath>
</taskdef>
<target name="download.antlib-svn" depends="retrieve.antlib-svn">
<!-- ant target="retrieve.antlib-svn" inheritAll="false"/ -->
</target>
<target name="retrieve.antlib-svn">
<get dest="${user.home}/.ant/lib/svnClientAdapter.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnClientAdapter.jar"/>
<get dest="${user.home}/.ant/lib/svnant.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnant.jar"/>
<get dest="${user.home}/.ant/lib/svnjavahl.jar" usetimestamp="1"
src="${url.ivyrepos}/antlib-svn/svnjavahl.jar"/>
</target>
如果仅缺少 svnant.jar,则一切正常。如果缺少 svnClientAdapter.jar,并且在尝试使用任务时出现“NoClassDefFoundError”,则这将在 taskdef 任务上出现“找不到类”错误。如前所述,我尝试过将retrieve.antlib-svn 目标称为依赖项、“ant”任务和“java”任务(使用fork)的位置。
这是 Ubuntu 10.10 和 RedHat ELS6 上带有 JDK 1.6.0_11 的 Ant 1.7.0。为简洁起见,删除了检测/避免代码。启用调试后,工作调用和失败之间的唯一区别是缺少的 jar 包含在 ant 的类路径中,我尝试在 taskdef 任务中覆盖它。
我不介意产生一个新的顶级 ant 调用,但 ivy.project.invoked-targets 在 1.7.0 中似乎不可用,而且我还没有找到另一种方法来调用具有相同起始目标的 ant。