2011-05-25 48 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擴展,我認爲這是無法實現的,而且我沒有一個關於如何實現的線索。