2011-05-25 49 views
1

我试图编写一个Ant脚本,从我们的仓库下载库(ivy和svnant),并使用它们作为taskdef的来自同一个构建脚本。它的工作原理,如果所有的库都存在或全部丢失,但如果需要的辅助库(如svnClientAdapter),然后我得到的错误:下载后加载ant库

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任务中重写该路径。

我不会介意产卵一个新的顶级蚂蚁调用,但ivy.project.invoked目标似乎并没有在1.7.0中可用,我还没有想出另一种方式来调用ant与相同的起始目标。

回答

1

它不能正常工作:它与Java类加载器递归工作的事实有关,它们解决了依赖性问题,而不是Ant本身。

我很抱歉,如果没有开发自己的Ant扩展,我认为这是无法实现的,而且我没有一个关于如何实现的线索。