1

リポジトリからライブラリ (ivy と svnant) をダウンロードし、それらを同じビルド スクリプトの taskdef として使用する Ant スクリプトを作成しようとしています。すべてのライブラリが存在するか、すべて欠落している場合は機能しますが、セカンダリ ライブラリ (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

つまり、プライマリ ライブラリが存在するかどうかに関係なく、すべて問題ありません。しかし、プライマリ ライブラリが存在し、依存ライブラリの 1 つが存在しない場合、エラーが発生します。他に何も変更されていない場合、2 番目の呼び出しは成功します。

タスクとクラスから検出/ダウンロード タスクを呼び出してみましたが、結果は同じでした。私が持っているコードは次のとおりです。

<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 タスクで「class not found」エラーが発生し、タスクを使用しようとすると「NoClassDefFoundError」で失敗します。前述のように、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 を呼び出す別の方法を見つけていません。

4

1 に答える 1

1

そのままでは機能しません。Java クラスローダーが再帰的に動作し、Ant 自体ではなく依存関係を解決するという事実に関係しています。

申し訳ありませんが、これは Ant 拡張機能を自分で開発しないと達成できないと思います。

于 2012-07-20T10:20:16.170 に答える