質問
私の Ant ビルド ファイルから非常に混乱した反応が返ってきたので、単に私の賢さが足りていないだけなのか、それともこれは実際にはバグなのではないか、と考えています。
私のプロジェクトには次のプロパティがグローバルに設定されています。
<property name="lib.dir" location="lib"/>
次に、ファイルセット (複数のリソース) を介して、このディレクトリからいくつかのファイルを jar ファイルに追加してみます。
<fileset dir="${basedir}" includes="lib/*filename*"/>
そのように一致する 3 つの異なるライブラリがあるはずです (そして存在します)。ただし、次のものを使用しようとすると、機能せず、ファイルが含まれません。
<fileset dir="${basedir}" includes="${lib.dir}/*filename*"/>
唯一の違いはグローバル プロパティの使用法にあることに注意してください。さて、簡単な質問です。最初のバージョンは宣伝どおりに動作するのに、2 番目のバージョンは動作しないのはなぜですか?
解決
「fileSet」式を使用するタスクの直前の「lib.dir」の実際の値を確認してください。まさにそれをグローバルに設定した後に誤って変更されていないことを確認するためだけです。<echo/>
タスクは役立ちます。
私は解決策を得ました。location
Attributeの説明は次のとおりです。
指定されたファイルの絶対ファイル名にプロパティを設定します。この属性の値が絶対パスである場合は、変更されずに(現在のプラットフォームの規則に変換されています)。そうでなければ、プロジェクトの基準と拡大された経路としてとられます。
value
の代わりにlocation
属性を単に使用します。これが違いを示すテストスクリプトです:
<project name="test">
<property name="test1" location="lib"></property>
<property name="test2" value="lib"></property>
<target name="target" description="description">
<echo>${test1}</echo>
<echo>${test2}</echo>
</target>
</project>
.
私のシステムの出力は次のとおりです。
Buildfile: D:\Develop\workspace-jabber\scrapbook\build.xml
target:
[echo] D:\Develop\workspace-jabber\scrapbook\lib
[echo] lib
BUILD SUCCESSFUL
Total time: 307 milliseconds
. 他のヒント
答えへの手がかりは見つかりましたが、まだすべてではありません。
ant -debug を使用してファイルセットの両方のバージョンを実行したところ、何が起こるかは次のとおりです。
動作している、プロパティを使用していないバージョンでは、次の出力が得られます。
fileset: Setup scanner in dir [pathToDir] with patternSet{ includes: [lib/*filename*] excludes: [] }
一方、動作するはずですが動作しないバージョンでは、次のようになります。
fileset: Setup scanner in dir [pathToDir] with patternSet{ includes: [ [pathToDir]/lib/*filename*] excludes: [] }
ご覧のとおり、ant は正規表現に [pathToDir] を追加し、次のように検索します。
[pathToDir]/[pathToDir]/lib/*filename*
それは明らかに存在しません。現在の問題:バージョンを正しく動作させるにはどうすればよいですか?
プロパティを作成するとき(グローバルまたはターゲットの中に行われますか?)、Directory lib
は存在しますか?そうでない場合、location
属性が機能しません - 代わりにvalue
属性を使用するか、ディレクトリの作成後にプロパティを定義します。
上記のように、問題は、$ {lib.dir}が全パスを含んでいたので、[PathToDir] / [PathTodir] / lib / filename
を検索することでした。$ {lib.dir}プロパティで不要な[PathToDir]を削除するには、そのタスクを使用しました。私は今、次のようになりましたが、今はとても素敵な解決策:
<basename property="lib.dir.rel" file="${lib.dir}"/>
<fileset dir="${basedir}" includes="${lib.dir.rel}/*filename*"/>
.
P.:2番目の外観で、andreas_dはまた、昨日昨日の正しい理由と良い提案を見つけたが、私は見落とさなければなりません: - /