我試圖編寫一個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與相同的起始目標。