19

更新:以下のPeter Nからのコメントに感謝します。)

私はいくつかのクラスを含むJavaパッケージを持っているため、その中にファイルがあります。ただし、最初はこれらのファイルの 1 つだけをコンパイルして、それを使用してパッケージ内の他のクラスを更新できるようにしたいと考えています。これは他のクラスのファクトリであり、結果としてそれらに依存しています。それらへの参照があります。

これを行うためにJavaCompile gradle タスクを使用しようとしています。その結果、JavaCompile のドキュメントを読み、例を検索しようとしましたが、ほとんど出回っていないようです。私はgradle forumsにも投稿しましたが、これまでのところゆっくりと進んでいます。

ant javac タスクを使用して、ant スクリプトで必要なことをすぐに実行できます。しかし、私はgradleでそれをやりたいと思っています(そして、ant.javacメソッドを使用せずに-それをしなければならない場合は、単にantを使用します)。

1 つのパッケージに 2 つのクラスのソース ファイルが 2 つだけ含まれるサンプル ケースを作成しました。

どちらのファイルも some.pkg というパッケージに含まれているため、次のディレクトリ構造になります。

  • .\build.gradle
  • .\src\main\java\some\pkg\ClassOne.java
  • .\src\main\java\some\pkg\ClassTwo.java

クラスワン:

package some.pkg;

import some.pkg.*;

public class ClassOne {
    public void doStuff() {
    }
}

クラス 2:

package some.pkg;

import some.pkg.*;

public class ClassTwo {
    public void ClassTwo() {
        ClassOne cone = new ClassOne();
        cone.doStuff();
    }
}

ご覧のとおり、ClassTwo (スタンドアロンでコンパイルしたいクラス) は ClassOne に依存しています。

Ant スクリプトは、次の単純なケースです。

<project>
    <property name="build.dir"     value="build"/>
    <property name="lib.dir"     value="lib"/>
    <property name="src.dir"     value="src/main/java"/>
    <target name="generate" >
        <mkdir dir="${build.dir}"/>
        <javac source="1.6" target="1.6" srcdir="${src.dir}" destdir="${build.dir}" 
               debug="true" includeantruntime="false"
               includes="some/pkg/ClassTwo.java">
        </javac>
    </target>
</project>

しかし、gradle では、javac (または JavaCompile タスク) が ClassOne を見つけられないという問題が引き続き発生します。それはあたかも sourcedir が本来あるべき場所を指していないかのようであり、実際、コマンドラインで javac を実行しているだけのようです。gradle 'JavaCompile' タスクの 'source' プロパティが ant の 'srcdir' プロパティのように機能していると思っていましたが、そうではないようです。だからここに私が現在試しているgradleスクリプトがあります:

apply plugin: 'java'

task compileOne (type: JavaCompile) {
    source = sourceSets.main.java.srcDirs
    include 'some/pkg/ClassTwo.java'
    classpath = sourceSets.main.compileClasspath
    destinationDir = sourceSets.main.output.classesDir
}

しかし、結果は次のとおりです。

C:\test\>gradle generate
:generate
C:\test\src\main\java\some\pkg\ClassTwo.java:7: cannot find symbol
symbol  : class ClassOne
location: class some.pkg.ClassTwo
                ClassOne cone = new ClassOne();
                ^
C:\test\src\main\java\some\pkg\ClassTwo.java:7: cannot find symbol
symbol  : class ClassOne
location: class some.pkg.ClassTwo
                ClassOne cone = new ClassOne();
                                    ^
2 errors
:generate FAILED

では、gradle で同等の ant javac を実現するにはどうすればよいでしょうか。

antjavac は、他のすべての関連クラスをコンパイルするスマートさを持っているようですが、gradle JavaCompile の場合、それを行うには sourceSet をセットアップする必要があると思います..よくわかりません..

ありがとう!

4

2 に答える 2

28

コメントの元の投稿に関する @PeterNiederwieser との議論のおかげで、完全を期すためにここで回答を提供します。

sourcepathAnt javac と非常によく似た方法で gradle JavaCompile 関数を使用するには、プロパティを介してコンパイラ オプションを指定する必要がありoptions.compilerArgsます。したがって、現在機能する gradle スクリプトは次のようになります。

apply plugin: 'java'

task compileOne (type: JavaCompile) {
    source = sourceSets.main.java.srcDirs
    include 'some/pkg/ClassTwo.java'
    classpath = sourceSets.main.compileClasspath
    destinationDir = sourceSets.main.output.classesDir
}

compileOne.options.compilerArgs = ["-sourcepath", "$projectDir/src/main/java"]

すべてが機能する最後の行 (唯一の違い) に特に注意してください。その結果、指定した単一の明示的なファイルのみを試行するのではなく、ビルド時に ClassOne と ClassTwo の両方を実際にコンパイルします。他のクラス (必須ではない) はコンパイルされないままです - ビルド ディレクトリを見て確認してください。

ありがとうピーター!

于 2013-10-17T05:22:12.160 に答える