ビルドプロセスにコード生成が含まれているプロジェクトを作成したいとします。生成されたコードは、メインコード(共通の基底クラスを継承しています)とJCenterのモジュール上にコンパイル時の依存関係があります。メインコードは、生成されたコードに効果的にランタイム依存性を持ちます。おそらく、アプリケーションが主コードと生成コードの両方にランタイム依存性を持ち、さらに両方のモジュール依存性を持っていると言う方が正しいでしょう。Gradleで生成されたソースセットにランタイム依存関係を追加する
EDIT:依存関係をより明確にするために、矢印は設定からそれが依存するものを指している、ちょっとした図です。ご覧のように、依存関係グラフにはサイクルはありません。
main compile ← generated compile → generated module
↑ ↑
main runtime → generated runtime
私は本当に生成コードをメインコードに設定された別のソースに入れたいと思います。また、アプリケーションプラグインを使用して、gradle run
とgradle installDist
を提供したいと考えています。
最新のGradle 3.3を使用しています。
私はproject to try thisを作成しました。
sourceSets {
generated {
java {
srcDirs = ["$buildDir/src/generated/java"]
compileClasspath += sourceSets.main.output
}
}
main {
java {
runtimeClasspath += sourceSets.generated.output + sourceSets.generated.runtimeClasspath
}
}
}
とコード生成するタスクがある:それには、ソースセットがある
task generateSource {
doLast {
// generate the code into sourceSets.generated.java.srcDirs[0] here
}
}
compileGeneratedJava.dependsOn generateSource
生成と生成されたコードの作業罰金のコンパイルが。 gradle generatedClasses
と言うと、メインコードをコンパイルし、ソースを生成し、生成されたコードをコンパイルします。
ただし、実行中でも配信も正しく動作しません。私がgradle run
と言うと、生成されたコードの生成やコンパイルを試みません。私がgradle generatedClasses run
と言うと、生成されたコードが生成され、コンパイルされますが、実行されたJavaプロセスのクラスパスには追加されません。もし私がgradle installDist
と言うと、生成されたコードを生成したりコンパイルしたりしません。同様に、gradle generatedClasses installDist
と言うと、生成されたコードが生成され、コンパイルされますが、配布には含まれません。
生成されたソースセットのモジュール依存関係も、クラスパスまたはディストリビューションには含まれません。
task runProperly(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = mainClassName
}
完璧に動作すること:
本当に奇妙なことは、私は、実行タスクの独自のバージョンで定義した場合ということです!
なぜ、コンパイルされたクラスも、生成されたソースセットのモジュール依存関係も、実行クラスまたは配布クラスパスに含まれていませんか?
ソースセット定義の後にプラグインアプリケーションを移動すると、実際に 'gradle run'が正しく動作します。ありがとう!しかし、 'gradle installDist'は動作しません。生成されたコードも依存関係も配布に含まれません。 –
生成されたソースを独立したソースセットに保存することは非常に賢明です。なぜなら、独自の依存関係を持つことができるからです。生成されたコードでは、通常のコードでは使用しない特別なライブラリがいくつか使用されています。そのため、私はそれらを衛生の問題として別々にしておきたいと思います。それは重要ではありませんが、それは役に立つでしょう。 –
コード内に相互参照があります。ですから、 'main'で一つのクラスをコンパイルし、' generated'で一つのクラスをコンパイルし、 'main'をもう一度コンパイルすることはできません。生成されたコードは、とにかく 'main'のクラスパスを使用します。 –