← Spring コース
32. Gradle: タスクの依存関係と、変更が無ければ飛ばす仕組み
build と打つと、 は実行の前にの依存関係から実行順を決めます。 を付けると実行せず順だけが出て、雛形では から build まで13行でした。 ののような固定の列はなく、「 は classes の出力を使う」のような依存関係をたどった結果が順番になります。build のように、他を束ねるだけのタスクもあります。
2回目の build は13行のうち12行が (残る1行はテスト用が無く )で、何も実行されませんでした。判定は更新時刻ではなく、入力と出力の内容のハッシュです。touch では何も再実行されず、逆にコメントを1行足すと compileJava が走り、 の行番号が変わるので bootJar と test まで再実行されました。 を付けると、変わった入力が出ます。
飛ばす仕組みはほかに2つあります。 は、 で出力を消しても前回の出力を倉庫から戻すもので、雛形では compileJava・compileTestJava・test が になりました。 は、スクリプトを読んで実行順を決める段階を再利用します。(ビルド後も残る常駐のプロセス)も既定で動き、その有無の差は後のレッスンで測ります。
点線の付いた語はタップすると説明が出ます。用語集を開く →
compileJavasrc/main/java → build/classes/java/main
processResourcessrc/main/resources → build/resources/main
両方の出力を束ねる(自分では何もしない)
classesDepends on: compileJava, processResources
Boot のプラグインが足したタスクと、java プラグインの jar
resolveMainClassNamemain を持つクラスを探す
bootJar実行可能 JAR(19,903,503 B)。runtimeClasspath の JAR を BOOT-INF/lib へ
jar自分のクラスとリソースだけの -plain.jar(2,065 B)。依存は入らない
assemble が2つの JAR を束ね、テスト側の列が続く
assembleDepends on: jar(Boot が bootJar も足す)
compileTestJavasrc/test/java → build/classes/java/test
testClassesprocessTestResources は NO-SOURCE
テストの実行と、その束ね
testJUnit Platform(JUnit 5)で実行。build/test-results に XML
checkDepends on: test
最後に
buildDepends on: check, assemble。「Assembles and tests this project.」
- ・Gradle 9.7.1 の手引きでは、タスクは有向非巡回グラフ(DAG)を成し、Gradle はどのタスクも実行する前にタスクグラフを作る、とあります。上の順はそのグラフを一列に並べたものです
- ・依存関係には、taskB が taskA の出力を使うことから Gradle が推測する暗黙のものと、dependsOn などで書く明示のものがあります。雛形のスクリプトに dependsOn はありません。java プラグインと Boot プラグインが登録しています
- ・この雛形で、2回目(変更なし)は 7 actionable tasks: 7 up-to-date、HelloController.java の文字列を1か所変えると 5 executed, 2 up-to-date(processResources と compileTestJava が UP-TO-DATE)でした。application.properties に1行足すと、逆に compileJava が UP-TO-DATE で processResources から再実行されました
- ・--build-cache で FROM-CACHE になったのは compileJava・compileTestJava・test の3つで、bootJar・jar・processResources は実行されました。この違いの理由は文書で確かめていないので、ここでは事実だけを書きます
- ・Maven との違い: Maven のフェーズは順番が固定された列で、変更が無くてもテストは毎回走り、spring-boot:repackage が毎回 JAR を書き直します(Replacing main artifact)。compiler plugin は Nothing to compile を出し、jar:jar は Building jar を出しませんでした。Gradle はタスクごとに入出力で判定し、テストも飛ばします
- ・下のコードは「更新時刻」と「内容のハッシュ」の2つの規則の模型です。Ant の <javac> は更新時刻で判定するので touch で再コンパイルし、Gradle は内容で判定するので touch では何も起きません。この対比は実機でも同じでした
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Java
図やコードに出てくる用語(タップで説明)
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗