下载后加载ant库

时间:2011-05-25 16:08:40

标签: ant download classpath taskdef

我正在尝试编写一个从我们的存储库下载库(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的另一种方式起始目标。

1 个答案:

答案 0 :(得分:1)

它不会开箱即用:它与Java类加载器以递归方式工作并且它们解决依赖关系而不是Ant本身有关。

我为你感到抱歉,我认为如果不开发自己的Ant扩展,这是不可能实现的,而且我没有一个如何制作它的线索。