1

次のような多くのリソース セット定義を含む Ant ビルド システムを継承しました。

<files id="app1.lib.jars">
  <include name="${java}/jre/lib/jsse.jar"/>
  <include name="${work.lib}/jtidy.jar"/>
  ...
</files>

<files id="app2.lib.jars">
  <include name="${work.lib}/itext.jar"/>
  <include name="${work.lib}/commons-httpclient.jar"/>
  ...
</files>

<files id="app3.lib.jars">
  <include name="${work.lib}/jdom.jar"/>
  <include name="${ant.lib}/ant.jar"/>
  ...
</files>

これらはおそらく数十個あり、それぞれに 5 ~ 50 個のファイルを含めることができます。問題は、依存関係の管理に Ivy を使用するようにこのシステムを作り直していて、その過程でいくつかの参照が存在しないファイルを指していることです。残念ながら、Ant はこれらの悪いポインターを見つける手助けを提供しません。これらのリソース コレクションを使用してクラスパスを定義すると、<include...>見つからないファイルを指すタグは黙って無視されます。

コレクションを a のソースとして使用することでエラーを強制できると思いました<copy...>が、それでもfailonerror="true"悪い参照を無視しました。

コマンドライン-v(verbose) および-d(debug) オプションも役に立ちませんでした。出力は、一部が欠落していることを認めましたが、実際には表示されませんでした

 [echo] app1.lib.jars
 [copy] C:\dev\src\tomcat6\work\java\jre\lib\jsse.jar omitted as C:\dev\src\tomcat6\work\verify\jsse.jar is up to date.
 [copy] C:\dev\src\tomcat6\work\lib\axis-ant.jar omitted as C:\dev\src\tomcat6\work\verify\axis-ant.jar is up to date.
 ...
 [copy] No sources found.
 [echo] app2.lib.jars
 ...

1 回限りの解決策として、Ant ファイルのリソース セットからすべてのファイル名を抽出し、適切に並べ替えた後、(Ant 内の) すべてのファイルを一時ディレクトリにコピーした結果のディレクトリ リストと比較しました。

質問: リソースが見つからないファイルを指しているときに、できればリソースが定義されたときに Ant に教えてもらう方法はありますか?

4

1 に答える 1

4

これが1つの方法の図です。キーポイント

  • ファイルリストに変換filesします-ファイルセットやファイルとは異なり、ファイルシステムに存在しないファイルの名前を含めることができます。ファイルセットやファイルは、存在しないエントリを無視します。
  • 制限を使用して存在を確認します
  • fail何かが不足しているときにエラーに使用する

以下に示すリソースセレクターを使用するには、プロジェクトに「antlib:org.apache.tools.ant.types.resources.selectors」名前空間を追加する必要があります。1.7.0より古いバージョンのAntで問題が発生します。

<project name="so" default="checkfiles" basedir="."
xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">

<filelist id="app1.lib.jars">
  <file name="${java}/jre/lib/jsse.jar"/>
  <file name="${work.lib}/jtidy.jar"/>
  ...
</filelist>

<restrict id="missing.app1.lib.jars">
  <filelist refid="app1.lib.jars"/>
  <rsel:not>
    <rsel:exists/>
  </rsel:not>
</restrict>

<property name="missing.files" refid="missing.app1.lib.jars" />
<fail message="These files are missing: ${missing.files}">
  <condition>
    <length string="${missing.files}" when="greater" length="0" />
  </condition>
</fail>
<pathconvert property="found.files" refid="app1.lib.jars" />
<echo message="Found files ${found.files}" />

または、提案したように「コピー」タスクを使用することもできますが、ファイルの代わりにファイルリストを使用します。存在しない最初のリソースを処理しようとすると、コピーは失敗するはずです。

于 2009-11-25T00:06:51.013 に答える