2016-05-29 15 views
6

プロジェクトには、コンパイル時にJavaコードを生成するアノテーションプロセッサが含まれています。デフォルトでは、gradleはソースファイルをbuild/classesディレクトリに出力します。これは、IntelliJが新たに生成したソースファイルの発見にいくつかの問題を引き起こします。生成されたコードの出力ディレクトリをgradleに変更

gradle-to-sourceファイルを別のディレクトリに出力する方法はありますか?例えば、$buildDir/gen/main/javaまたは$buildDir/build/generated/main/java

答えて

9

生成されたJavaソース(documentation)の出力ディレクトリをカスタマイズできるJavaコンパイラのオプションがあります。

-s dirの

はどこ生成されたソースファイルを配置するディレクトリを指定します。 ディレクトリが既に存在している必要があります。 javacはそれを作成しません。クラスが のパッケージの一部である場合、コンパイラはソースファイルをパッケージ名を反映したサブディレクトリ に置き、必要に応じてディレクトリを作成します。 の例では、-s C:¥mysrcを指定し、そのクラスの名前が com.mypackage.MyClassの場合、ソースファイルは C:¥mysrc¥com¥mypackage¥MyClass.javaに配置されます。

build.gradle

compileJava { 
    options.compilerArgs << "-s" 
    options.compilerArgs << "$projectDir/generated/java" 

    doFirst { 
     // make sure that directory exists 
     file(new File(projectDir, "/generated/java")).mkdirs() 
    } 
} 

clean.doLast { 
    // clean-up directory when necessary 
    file(new File(projectDir, "/generated")).deleteDir() 
} 

sourceSets { 
    generated { 
     java { 
      srcDir "$projectDir/generated/java" 
     } 
    } 
} 

のこのコードスニペットは、次を行います。

  • を作成し、生成されたコードのための出力としてディレクトリを指定
  • クリーンタスクが呼び出された場合に生成されたソースを削除
  • 新しいソースセットを追加

更新

使用Gradleの代わりにapt plugin

+0

ありがとうございました - それは、私が '$ project.buildDir/generated/java'に生成されたファイルを置くことを好むという点で、私にとってはうまくいきます。それは、変更することを心配する必要はないということです。どのようにクリーンな作品。とにかく、実際にソースセットを追加する必要はないようですが、それはとにかく機能します。 –

+0

次の再コンパイル時に他の人がJavaコンパイルエラーに陥った場合は、doFirstブロックに次の行を追加してください: 'GFileUtils.cleanDirectory(directory); '..あなたのバージョンに応じて' FileUtils.cleanDirectory'を使う必要があるかもしれません – Darwayne

+0

@PetterMåhlén、なぜsourceSetの設定はオプションですか? gradleは、生成されたクラスを含むjarファイルを作成する必要があります。 – Sunnyday

1

単にあなたのbuild.gradleファイル内project.buildDirプロパティの値を指定します。

project.buildDir = '/gen/main/java' 

これは<project_root>/gen/main/javaフォルダにファイルをビルドし、生成されたすべて入れます。

+0

これは最適な解決策ではありません。生成されるだけでなく、コンパイラの出力もそのディレクトリ(.classファイルやソースコードに入れたくないその他のもの)に配置されるからです。 –

関連する問題