我正在尝试编写一个从我们的存储库下载库(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,则在taskdef任务上出现“未找到类”错误,并且在尝试使用该任务时出现“NoClassDefFoundError”失败。如上所述,我已经尝试将retrieve.antlib-svn目标作为依赖项,“ant”任务和“java”任务(使用fork)调用。
在Ubuntu 10.10和RedHat ELS6上使用的是带有JDK 1.6.0_11的Ant 1.7.0。为简洁起见,删除了检测/避免代码。通过调试,工作调用和失败之间的唯一区别是ant的类路径中包含缺少的jar,我尝试在taskdef任务中覆盖它。
我不介意产生一个新的顶级蚂蚁电话,但是ivy.project.invoked-targets似乎在1.7.0中不可用,我还没想出用另一种方法调用ant的另一种方式起始目标。
答案 0 :(得分:1)
它不会开箱即用:它与Java类加载器以递归方式工作并且它们解决依赖关系而不是Ant本身有关。
我为你感到抱歉,我认为如果不开发自己的Ant扩展,这是不可能实现的,而且我没有一个如何制作它的线索。