【问题标题】:Loading ant libraries after download下载后加载 ant 库
【发布时间】:2011-09-01 22:04:08
【问题描述】:

我正在尝试编写一个 Ant 脚本,它从我们的存储库下载库(ivy 和 svnant)并将它们用作来自同一构建脚本的 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 的方法。起始目标。

【问题讨论】:

    标签: ant download classpath taskdef


    【解决方案1】:

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

    对不起,我认为如果不为自己开发一个 Ant 扩展,这是无法实现的,而且我不知道如何制作它。

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多