2013-10-15 17 views
9

更新:おかげで以下のピーター・Nからのコメントに。)gradleを使って単一のJavaファイルをコンパイルするには?

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

私はこのためにJavaCompile gradle taskを使ってみました。その結果、私はJavaCompileのドキュメントを読み、サンプルを検索しようとしましたが、そこにはほとんどないようです。私もgradle forumsに投稿しましたが、これまでのところ遅くなっています。

私は、ant javacタスクを使用してantスクリプトで必要なことを容易に行うことができます。しかし、私はgradleで(そしてant.javacメソッドを使用せずに - 私がそれをしなければならない場合、私はちょうどantを使用します)それをしたいと思います。

1つのパッケージに2つのクラスのソースファイルが2つしかないサンプルケースを作成しました。

両方のファイルは、パッケージと呼ばれるsome.pkgであり、私たちはそれゆえ、次のディレクトリ構造があります。

  • を\ build.gradle
  • \ SRC \メイン\のJava \一部\ PKG \ ClassOne。 。の.java
  • \ SRC \メイン\のJava \一部\ PKG \ ClassTwo.java

ClassOne:

package some.pkg; 

import some.pkg.*; 

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

ClassTwo:

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 
} 

をしかし、それは、その結果:それでは、どのように私はGradleの中に蟻のjavac同等を達成ん

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 

ant javacは行くし、他のすべての関連するクラスをコンパイルする知性を持っているようだが、私はそれをするのsourceSetを設定する必要がありますGradleのJavaCompileのために推測..ないように注意してください。..

感謝!

+3

どのビルドシステムが使用されているかにかかわらず、動作できません。クラスパス上で 'ClassOne'を使って' ClassOne'と 'ClassTwo'を一緒にコンパイルするか、最初に' ClassOne'と 'ClassTwo'をコンパイルする必要があります。また、私はそれらを別々にコンパイルするあなたの動機を理解していません。 –

+0

こんにちは@PeterNiederwieser、どのようなビルドシステムが使用されているにもかかわらず、どういう意味ですか?コマンドラインのjavacと提供されているantのビルドスクリプト_DO_の両方で上記の例が動作することを保証できます。上記のフォルダ構造にファイルをコピーし、antとjavacのコマンドラインを試してみてください。あなたは簡単に動作することがわかります。 (また、私はjavacコマンドラインを更新しました。私が行っていたClassTwo.javaを指定するときに、ClassOne.javaを指定していたことに注意してください) –

+0

さて、私はちょうど別のプレイをしました。私は自分自身を混乱させたのではないかと心配しているantはソースの依存関係ツリー全体をコンパイルしているようですが、ClassTwo.javaのコマンドラインにあるjavacは、ClassOne.javaを最初にやらなければ動作しません。うん、私は自分自身を混乱させたと思う。私はまず自分のテストを確認します。ありがとうございました。 –

答えて

16

@PeterNiederwieserのコメントの元の投稿についての議論のおかげで、ここでは完全性のための回答を提供します。

JavaCompile関数をant javacと非常によく似た方法で使用するには、options.compilerArgsプロパティを使用してsourcepathコンパイラオプションを指定する必要があります。次のようにそのため、今作品の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の両方をコンパイルすることになります。他のクラス(必須ではない)はコンパイルされずに残っています。ビルドディレクトリを確認することで確認できます。

ありがとうございました!

関連する問題