10

ソースがsrc/ツリー(および場合によってはtest /ツリー)にあるとします。そのツリーの一部だけをコンパイルしたいとします。私がそれをやりたいと思う理由はさまざまです。例として、(特定のクラスを含めずに)可能な限り最小のjarを作成したい場合や、コンパイル対象のコンパイル時間を最速にしたい場合があります。しかし、私は絶対にすべての依存関係をコンパイルしたいです!

これは、次のコマンドラインから簡単に実行できます。

javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java

さて、どうやってアリでそれをすることができますか?javac antタスクはすべてをコンパイルします

ソースディレクトリと宛先ディレクトリは、コンパイルするJavaソースファイルを再帰的にスキャンします。

excludesおよびパラメータを使用できますincludesが、この目的には問題があります。実際、includes(自動依存関係ルックアップではなく)すべてを明示的に設定する必要があるようです。最悪の場合でも除外するものが優先されます

包含と除外の両方が使用される場合、少なくとも1つの包含パターンに一致し、どの除外パターンにも一致しないファイル/ディレクトリのみが使用されます。

したがって、使用することはできません

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
            excludes="**/*.java" includes="src/path/to/MyClass.java" />  

何もコンパイルしないので:-(

javacantでその単純なコマンドラインを実現する方法はありますか?


編集:あなたの答えをありがとう、Sadie、私はそれを受け入れています、なぜならそれは私がこの質問で思っていたように機能するからです。しかし、私はいくつかのコメントを持っています(あなたの答えのコメントフィールドに入るには長すぎます):

1)私はドキュメントを読みました(上記のリンクを参照)が、includesあなただけで実際に他のすべてを除外しているのかどうかは不明です

2)あなたがちょうどincludesantログのようなものをするとき

[javac] Compiling 1 source file to /my/path/to/build

依存関係によって、(多くの)複数のソースファイルをコンパイルする場合でも。

4

4 に答える 4

13

なぜ除外するのか、含めるのか?少なくとも1つのインクルードがある場合、ファイルは明示的にインクルードされている場合にのみコンパイルされます。したがって、これは機能するはずです。

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"
        includes="src/path/to/MyClass.java" />

またはより柔軟に:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath">
    <include name="src/path/to/MyClass.java"/>
    <include name="src/path/to/AnotherClass.java"/>
</javac>

jarに特定のパッケージまたはクラスのみを含めるには、fileset属性を使用します

<jar jarfile="${outlib}/something.jar">
    <fileset dir="${build.dir}">
        <include name='src/path/to/classes' />
    </fileset>
</jar>

ここでも、複数のインクルードを使用して個別のパッケージを組み合わせることができます。インクルードを試してドキュメントを読むと、必要な答えが確実に見つかります。

于 2008-10-15T02:39:07.927 に答える
0

実際には、antはすべてをチェックするだけです。コンパイルを 2 回続けて実行すると、2 回目のほうがはるかに高速であることがわかります。実際、物事を見逃すように簡単に説得することができます。

すべてを考慮したくない場合でも、それをより小さなモジュール/プロジェクト/ソースツリーに分割して、何をコンパイルするかをantに明示的に伝える必要があります。

于 2008-10-15T01:51:13.013 に答える
0

ビルドしたいファイルのコンマ区切りリストのみを指定してください。例を挙げましょう

<property name="includeFileList" value="<name of java class>.java"/>

<javac srcdir="${src.dir}" destdir="${build.dir}"
       target="1.6" debug="true" includes="${includeFileList}"/>

それが動作します。

于 2013-06-23T13:59:54.083 に答える