web-dev-qa-db-ja.com

antのjavacタスクでソースを除外するにはどうすればよいですか?

Build.xmlには次のものがあります。

<target name="compile.baz" depends="init">
   <javac destdir="${build.dir}/classes" debug="on">
      <compilerarg value="-Xlint:deprecation"/>
      <src>
         <pathelement location="${src.dir}/com/foo/bar/baz/" />
         <pathelement location="${src.dir}/com/foo/bar/quux/" />
         <!-- Need to exclude ${src.dir}/com/foo/bar/quux/dontwant/ -->
      </src>
      <classpath refid="classpath.jars" />
   </javac>
   ...
</target>

これは、(コメントが言うように)私がすることを除いて、ほとんど私が望むことをしますnotファイルが欲しい
${src.dir}/com/foo/bar/quux/dontwant/このタスクでコンパイルされます(ただし、その他すべて${src.dir}/com/foo/bar/quux/このタスクでコンパイルされます)。

私は完全なアリn00bであり、ドキュメントは私にとってあまり役に立ちませんでした。さまざまな除外/除外要素/属性があると書かれている場所がいくつかありますが、考えられるすべてのバリエーションは効果がないか、「blahは '除外をサポートしていません」のようなエラーになります。 「属性」。

16

数人が<exclude>の使用を提案しました。これは、私のタスクが指定された方法では機能しませんでした。 このページの6番目の例 にリンクされたtrashgodの回答は、タスク仕様を再構築する方法のアイデアを与えてくれました。

私の問題は、ソースファイルを指定する方法に関連しているようです。次のように、<pathelement><src>要素を使用するのではなく:

<src>
   <pathelement location="${src.dir}/com/foo/bar/baz/" />
   <pathelement location="${src.dir}/com/foo/bar/quux/" />
</src>

次のように、パスを含む単一の<src>を使用し、次に<include>要素のセットを使用するように切り替えました。

<src path="${src.dir}" />
<include name="com/foo/bar/baz/**" />
<include name="com/foo/bar/quux/**" />

これは機能的には同じように見えますが、<exclude>の使用と互換性があります。

<exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/>

(実際、そもそもそこにあったものがまったく機能したことに驚いています。)

17

私の実験から、除外したいファイルのフルパスを含めるべきではありません。これは機能しません:

<javac>
(...>
   <exclude name="${src.dir}/com/foo/blah/blah1/FILENAME.Java"/>
(...)
</javac>

しかし、これはします:

<javac>
(...>
   <exclude name="com/foo/blah/blah1/FILENAME.Java"/>
(...)
</javac>
11
May Bogus

試してみてください

<javac>
(...>
<exclude name="${src.dir}/com/foo/bar/quux/dontwant/*" />
(...)
</javac>
5
matiasf

残りについてはよくわかりませんが、<exclude/>ネストされた要素は Javac タスクで機能するはずです。 6番目の ダウンを参照してください。

補遺:**表記を含むパターンについては、 ディレクトリベースのタスク で説明しています。

<target name="compile.baz" depends="init">
    <javac destdir="${build.dir}/classes" debug="on">
        <compilerarg value="-Xlint:deprecation"/>
        <src>
            <pathelement location="${src.dir}/com/foo/bar/baz/" />
            <pathelement location="${src.dir}/com/foo/bar/quux/" />
        </src>
        <exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/>
        ...
    </javac>
    ...
</target>
5
trashgod

Javaクラスを除外しようとしているが、Antがまだそれらをコンパイルしようとしている場合、これはコード内のこれらのクラスへの参照が原因である可能性があります。

A.JavaにB.Javaへの参照があり、B.Javaを除外しようとすると、A.Javaをコンパイルするには、B.Javaもコンパイルする必要があります。

これがJavaのインターフェースの理由の1つであるため、実装をコンパイルしなくてもインターフェースをコンパイルできます。

4
Giles