3

セミコロンで区切られたディレクトリのリストを含む ant プロパティ ${src.dirs} があります。次に、(replaceregexp の) ファイルセットを指定する必要があります。そのファイルセットには、${src.dirs} にリストされているすべてのディレクトリのすべての Java ファイルが含まれている必要があります。どうすればできますか(ant-contribのファンキーなものは使用せず、プレーンなバニラantを使用します)。

プロパティ正規表現の使用方法の例がありsrc.dirsます が、使用しようとすると次のエラーが発生します。 /usr/work/dir1/src;/usr/work/java/dir2/src;/usr/libabc/src build.xml:98: Problem: failed to create task or type propertyregex

編集: これが私の最終的な解決策です:

<loadresource property="source.dir.javafiles">
  <propertyresource name="source.dir"/>
  <filterchain>
    <tokenfilter>
      <replaceregex pattern="\s*([;,]\s*)*$" replace="/**/*.java"/>
      <replaceregex pattern="\s*([;,]\s*)+"  replace="/**/*.java," flags="g"/>
   </tokenfilter>
  </filterchain>
</loadresource>

<fileset dir="" includes="${source.dir.javafiles}"/>

これらの正規表現により、末尾のコンマまたはセミコロンが間違ったファイル セレクターを生成しないことが保証されます。

4

3 に答える 3

2

ant-contrib を使用せずにこれを実行できる場合があります。可能性は次のとおりです。

<property
     name="dirlist"
     value="/usr/work/dir1/src;/usr/work/java/dir2/src;/usr/libabc/src" />

<property name="file.wildcard" value="*.java" />    
<loadresource property="dirs.include">
  <propertyresource name="dirlist"/>
  <filterchain>
    <tokenfilter>
      <replaceregex pattern="^/" replace="" />
      <replaceregex pattern=";/" replace="/**/${file.wildcard}," flags="g"/>
      <replaceregex pattern="$"  replace="/**/${file.wildcard}" />
   </tokenfilter>
  </filterchain>
</loadresource>

<fileset id="files" dir="/" includes="${dirs.include}" />

作業は 2 つに分けられます。1 つ目は、セミコロンで区切られたリストをfileset includes属性での使用に適したパターンに変換する文字列処理です。次に、パターンからファイルセットを作成します。

ここでのloadresourceタスクは、一連の単純な正規表現置換のラッパーとして使用されているだけです。3 つの置換は先頭のルート ディレクトリを処理し、\文字列内のセミコロンを Ant パターンとコンマ (includesエントリを区切るために属性で使用されます) に展開し、文字列の末尾にパターンを追加します。

あなたの場合dir、ファイルセットの属性でルートディレクトリを使用しないようにこれを調整することを検討してください。

于 2013-05-07T21:12:30.927 に答える
0

これらのディレクトリを調べてコンパイルするだけですか、それとも依存関係のためにこれらのディレクトリを一緒にコンパイルする必要がありますか?

依存関係がない場合は、 Ant-Contrib<for/>でタスクを試すことができます。これにより、次のようなリストをループできます。

<for list="${src.dirs}"
    param="my.src.dir"
    delimiter=";">
    <sequential>
        <javac destdir="${javac.destdir}"
             srcdir="@{my.src.dir}"
             classpathref="main.classpath"/>
    </sequential>
</for>

もちろん、正しいdestdir. タスクを使用すると、<var/>タスクが便利になる場合があり<for/>ます。この<var/>タスクでは、変数名をリセットできます。一連のタスクを繰り返すと、<sequential/>特定のプロパティをリセットしたい場合があります。

ちなみに、Ant 1.8以上なら<local/>タスクの代わりに使えます<var/>

于 2013-05-07T22:19:53.060 に答える