เวลาอ่าน : 15 minutes

คุณเคยผ่านช่วงเวลาที่เพียง`./gradlew build`ที่คุณรันวันละร้อยครั้งจู่ๆ ก็พังด้วยข้อผิดพลาดที่ไม่เคยเห็นมาก่อน? คูณมันด้วยข้อผิดพลาดต่อเนื่องสิบเอ็ดครั้ง เพิ่มความไม่เข้ากันของ Docker Engine 29 เข้าไปเต็มๆ โรยด้วย Gradle 9 ที่ทำให้ API ที่เราใช้มานานสิบปีหายไป นี่คือบันทึกการเดินทางฉบับสมบูรณ์


แผนภาพที่ 1 — การย้ายไปยัง Gradle 9 (ห่วงโซ่ข้อผิดพลาด)

วัตถุประสงค์: เพื่อแสดงชุดของความไม่เข้ากัน

👉 ชัดเจน เน้นที่ Gradle
@startuml
left to right direction
title การย้ายไปยัง Gradle 9
rectangle "1\nreportsDir" as A
rectangle "2\nmainClass" as B
rectangle "3\nsourceCompatibility" as C
rectangle "4\nGroovy assert" as D

A --> B
B --> C
C --> D

@enduml

แผนภาพที่ 2 — ปลั๊กอิน JHipster ที่เข้ากันไม่ได้

วัตถุประสงค์: แยกปลั๊กอินที่เสียหายออก

👉 มุมมองที่ชัดเจนเกี่ยวกับการพึ่งพา.
@startuml
left to right direction
title ปลั๊กอินที่ต้องแก้ไข
skinparam shadowing false
skinparam roundcorner 18

rectangle "1\nopenApiGenerate" as A #FFF3E0
rectangle "2\ngitProperties\n2.5.7" as B #FFF3E0
rectangle "3\nเวอร์ชันที่แก้ไขแล้ว" as C #E3F2FD
rectangle "4\nAssemble OK" as D #E8F5E9

A --> B
B --> C
C --> D

@enduml

แผนภาพที่ 3 — Docker 29 / Testcontainers

วัตถุประสงค์: ปัญหารันไทม์

👉 ประวัติที่ชัดเจนของรันไทม์.
@startuml
left to right direction
title Docker 29 + Testcontainers

skinparam shadowing false
skinparam roundcorner 18
skinparam defaultFontSize 14

rectangle "1\nประกอบ OK" as A #E8F5E9
rectangle "2\nทดสอบ Cucumber FAIL" as B #FFEBEE
rectangle "3\nTestcontainers 1.32\nถูกปฏิเสธ" as C #FFF3E0
rectangle "4\nอัปเกรด\nเวอร์ชัน" as D #E3F2FD
rectangle "5\nบิลด์สุดท้าย OK" as E #E8F5E9

A --> B
B --> C
C --> D
D --> E

@enduml

อีกวิธีหนึ่งในการนึกภาพสิ่งนั้น
@startuml

!option handwritten true

skinparam backgroundColor #FEFEFE
skinparam shadowing false
skinparam defaultFontName Inter
skinparam defaultFontSize 14
skinparam ArrowThickness 2
skinparam RoundCorner 18

title แผนงานการทำให้เสถียร — Gradle 9 สู่บิลด์สุดท้าย
left to right direction

rectangle "⚙️ การย้าย Gradle 9" as A #E3F2FD
rectangle "🧩 ปลั๊กอิน JHipster" as B #FFF3E0
rectangle "🐳 Docker 29\nTestcontainers" as C #FCE4EC
rectangle "✅ บิลด์ที่เสถียร" as D #E8F5E9

note bottom of A
reportsDir
mainClass
sourceCompatibility
Groovy assert
end note

note bottom of B
openApiGenerate
gitProperties
เวอร์ชันที่สอดคล้องกัน
end note

note bottom of C
การทดสอบ Cucumber ไม่ผ่าน
อิมเมจ Docker ถูกปฏิเสธ
อัปเกรดไลบรารี
end note

A -[#42A5F5]-> B : corrections build.gradle
B -[#FB8C00]-> C : assemble OK
C -[#E53935]-> D : tests réparés

@enduml

ฉาก: โปรเจกต์ JHipster, บิลด์ที่ไม่โหลดอีกต่อไป

โครงการ`edster`เป็นแอปพลิเคชัน JHipster ที่สร้างขึ้นในปี 2024 สคริปต์ build ราก`build.gradle`คงที่มาหลายเดือน จากนั้นเราตัดสินใจอัปเกรดเวอร์ชัน:

ส่วนประกอบ เวอร์ชันเป้าหมาย

Gradle

9.4.1

จาวา

21.0.11-tem (Eclipse Temurin)

JHipster

8.x (เฟรมเวิร์ก`tech.jhipster:jhipster-framework:8.11.0`)

สปริงบูต

3.4.5

คอตลิน

2.3.0

Docker Engine

29.4.1 (API 1.54)

การเปลี่ยนเวอร์ชัน Java ทำผ่าน SDKMAN:

sdk use java 21.0.11-tem

การเปิดตัวครั้งแรก:

$ ./gradlew build --no-daemon

FAILURE: Build failed with an exception.

* Where:
Build file '/home/.../edster/build.gradle' line: 18

* What went wrong:
An exception occurred applying plugin request [id: 'jhipster.cucumber-conventions']
> Failed to apply plugin 'jhipster.cucumber-conventions'.
   > Could not create task ':cucumberTest'.
      > Could not create task ':consoleLauncherTest'.
         > Could not set unknown property 'reportsDir' for task ':consoleLauncherTest'

เราไม่สามารถผ่านขั้นตอนการโหลด build script ไปได้เลย ปัญหาอยู่ใน`buildSrc/src/main/groovy/jhipster.cucumber-conventions.gradle`Please provide the French text you’d like me to translate.

ข้อผิดพลาด 1: ตัวแปรผี `reportsDir

สคริปต์`jhipster.cucumber-conventions.gradle`ประกอบด้วย:

tasks.register('consoleLauncherTest', JavaExec) {
    dependsOn(testClasses)
    String cucumberReportsDir = file("$buildDir/reports/tests")
    outputs.dir(reportsDir)           // <-- reportsDir n'existe PAS
    classpath = sourceSets["test"].runtimeClasspath
    main = "org.junit.platform.console.ConsoleLauncher"
    // ...
}

ตัวแปรที่กำหนดคือ`cucumberReportsDir`. ตัวที่ใช้คือ`reportsDir`-- ซึ่งไม่ได้ถูกกำหนดไว้ที่ใดเลย

การแก้ไขPlease provide the French text you would like me to translate.outputs.dir(cucumberReportsDir)

ข้อผิดพลาด 2: main = "…​" ไม่มีอยู่แล้วใน Gradle 9

ติดตามทันที:

Could not set unknown property 'main' for task ':consoleLauncherTest' of type org.gradle.api.tasks.JavaExec.

Gradle 9 ลบพร็อพเพอร์ตี้`main`เพื่อประโยชน์ของ`mainClass`เกี่ยวกับงาน`JavaExec`.

การแก้ไขโปรดระบุข้อความที่คุณต้องการให้แปลครับ`mainClass = "org.junit.platform.console.ConsoleLauncher"`

ข้อผิดพลาด 3: sourceCompatibility ไม่ใช่คุณสมบัติของโปรเจกต์อีกต่อไป

ข้อผิดพลาดใหม่:

Could not set unknown property 'sourceCompatibility' for root project 'edster' of type org.gradle.api.Project.

สคริปต์รูทมี:

sourceCompatibility=17
targetCompatibility=17

Gradle 9 ลบพร็อพเพอร์ตี้เหล่านี้ที่ระดับ root พวกมันต้องอยู่ในบล็อก`java`.

การแก้ไขPlease provide the French text you’d like me to translate.

java {
    sourceCompatibility = JavaVersion.VERSION_21
    targetCompatibility = JavaVersion.VERSION_21
}

ข้อผิดพลาด 4: การยืนยัน Groovy แบบสามตัวถูกดำเนินการ

สคริปต์เก่ามี:

assert System.properties["java.specification.version"] == "17" || "21" || "24"

ใน Groovy,"21" et "24"`เป็นสตริงที่เป็น truthy นิพจน์จะให้ผลเป็น(…​ == "17") || true || true`, ซึ่งเป็นจริงเสมอ — แต่ไวยากรณ์ไม่ถูกต้องสำหรับการยืนยันแบบเข้มงวดที่ต้องการ

การแก้ไขPlease provide the French text you’d like me to translate.

assert System.properties["java.specification.version"] in ["17", "21", "23", "24"]

ข้อผิดพลาด 5: การพึ่งพาโดยนัย compileKotlin → `openApiGenerate

บิลด์กำลังดำเนินไป การคอมไพล์ Kotlin สำเร็จแล้ว จากนั้น:

Task ':compileKotlin' uses this output of task ':openApiGenerate'
without declaring an explicit or implicit dependency.

Gradle 9 ปฏิเสธการพึ่งพาโดยนัยระหว่างทาสก์ เนื่องจาก`compileKotlin`อ่านแหล่งที่มาที่สร้างโดย`openApiGenerate`, ต้องประกาศลิงก์

การแก้ไขใน`build.gradle`No text was provided to translate.

afterEvaluate {
    tasks.named("compileKotlin").configure {
        dependsOn(tasks.named("openApiGenerate"))
    }
}

Le `afterEvaluate`จำเป็นเพราะ`openApiGenerate`เป็นส่วนขยาย (ปลั๊กอิน OpenAPI Generator) และไม่ใช่ทาสก์ที่สามารถเข้าถึงได้โดยตรงในระหว่างขั้นตอนการกำหนดค่า

ข้อผิดพลาด 6: generateGitProperties ล้มเหลวที่ `FilterOutputStream.write()

การคอมไพล์ Java ผ่านแล้ว ทรัพยากรได้รับการประมวลผล จากนั้น:

> Task :generateGitProperties FAILED

No signature of method: java.io.FilterOutputStream.write() is applicable for argument types: (Integer) values: [103]

ปลั๊กอิน`gradle-git-properties`เวอร์ชัน 2.5.0 ไม่เข้ากันกับ Java 21 / Gradle 9 บั๊กภายในพยายามเรียก`write(int)`ผ่าน Groovy บนสตรีมที่ปิดมัน

การแก้ไขใน`gradle.properties`Please provide the French text you’d like me to translate into Thai.

gitPropertiesPluginVersion=2.5.7

ในที่สุด: Testcontainers ก็เข้าสู่ฉาก

จนถึงตอนนี้ มันเป็นการดีบักสคริปต์บิลด์ล้วน ๆ ข้อผิดพลาดแต่ละข้อคือความเข้ากันไม่ได้ของ Gradle 9 หรือ Java 21 ในสคริปต์บิลด์ หลังจากหกการแก้ไขข้างต้นแล้ว`./gradlew assemble`ผ่านไปด้วยดี

แต่`./gradlew build`รันการทดสอบด้วย และการทดสอบ Cucumber ใช้ Testcontainers เพื่อเริ่ม PostgreSQL ชั่วคราว

Could not find a valid Docker environment.

EnvironmentAndSystemPropertyClientProviderStrategy: failed with exception BadRequestException
(Status 400: {"message":"client version 1.32 is too old. Minimum supported API version is 1.40"}
UnixSocketClientProviderStrategy: failed with exception BadRequestException
(Status 400: {"message":"client version 1.32 is too old. Minimum supported API version is 1.40"}

Testcontainers ไม่สามารถสื่อสารกับ Docker ได้ กลยุทธ์ที่แตกต่างกันสองแบบ (ตัวแปรสภาพแวดล้อม + ซ็อกเก็ต Unix) ล้มเหลวด้วยข้อผิดพลาดเดียวกัน

@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false

actor "Testcontainers\n1.20.6" as TC
participant "docker-java\n3.4.1" as DJ
participant "Docker Engine\n29.4.1" as DE

TC -> DJ : new DockerClient()
DJ -> DE : GET /_ping\nUser-Agent: docker-java/3.4.1\nAPI-Version: 1.32
DE --> DJ : HTTP 400 Bad Request\nclient version 1.32 is too old.\nMinimum supported API version is 1.40
DJ --> TC : BadRequestException
TC --> TC : Could not find a valid\nDocker environment

note right of DE
  Docker Engine 29.x impose
  API minimum = 1.40
  (défaut ancien : 1.24)
end note

note left of DJ
  docker-java 3.4.1 envoie
  hardcoded API version 1.32
  dans l'en-tête HTTP
end note

@enduml

ระยะที่ 1 : แนวทาง docker-java

ปฏิกิริยาแรก: ไคลเอนต์ Docker Java ที่ Testcontainers ใช้ส่งเวอร์ชัน API`1.32`ในการแฮนด์เชค HTTP ของตน แต่ Docker Engine 29.4.1 กำหนดขั้นต่ำของ`1.40`. ปัญหาอยู่ที่ฝั่งไคลเอนต์ ไม่ใช่ที่แดมอน

การตรวจสอบเวอร์ชันของ docker-java ที่ถูก resolve โดย Testcontainers 1.20.6:

$ ./gradlew dependencies --configuration testRuntimeClasspath | grep docker-java

+--- com.github.docker-java:docker-java-api:3.4.1
+--- com.github.docker-java:docker-java-transport:3.4.1

docker-java 3.4.1 ซึ่งมาจาก Testcontainers 1.20.6 เวอร์ชันสาธารณะล่าสุดของ docker-java คือ 3.5.1 ลองบังคับให้อัปเกรดเวอร์ชันผ่าน`resolutionStrategy`ในบล็อก`configurations` de `build.gradle`Please provide the French text you’d like me to translate into Thai.

configurations {
    all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == "com.github.docker-java"
                && details.requested.name.startsWith("docker-java")) {
                details.useVersion("3.5.1")
            }
        }
    }
}

รัน build ใหม่ ข้อผิดพลาดเดิม:`client version 1.32 is too old`.

การตรวจสอบแคช Gradle: ดาวน์โหลด JAR ใหม่แล้ว แต่ข้อผิดพลาดยังคงอยู่ docker-java 3.5.1 ยังคงส่ง`1.32`. เวอร์ชันนี้จึงไม่เพียงพอสำหรับ Docker Engine 29.4.1

การทำให้บริสุทธิ์: ล้างแคช Gradle ให้หมดสิ้น เพียงเพื่อความแน่ใจ :

rm -rf ~/.gradle/caches
rm -rf /path/to/project/.gradle

รีสตาร์ทแบบเต็มรูปแบบหลัง purge แล้วยังเกิดข้อผิดพลาดเดิม

ระยะที่ 2: การค้นหาเว็บและเบรดครัมบ์ GitHub

docker-java 3.5.1 ไม่เพียงพอ เหลือเพียงแค่ค้นหาว่ามีใครเคยเจอปัญหานี้แบบตรงตัวบ้างหรือไม่

การค้นหาแบบเจาะจงใน issue ของ testcontainers-java และ docker-java:

site:github.com/testcontainers "client version 1.32 is too old"
site:github.com/docker-java "client version 1.32" Docker Engine 29

ผลลัพธ์แรกทันที:

เส้นทางนั้นชัดเจน: Docker Engine 29.x ได้ยกระดับเวอร์ชัน API ขั้นต่ำของตนจาก`1.24`(ข้อบกพร่องเดิม) ถึง`1.40`. Testcontainers 1.20.x ใช้ docker-java 3.4.x ซึ่งเจรจาเวอร์ชัน API โดยการส่ง`1.32`. เดมอนปฏิเสธอย่างสุภาพแต่หนักแน่น

ใน issue #11491 ผู้ดูแลตอบว่า:

Please provide the French text you’d like me to translate into Thai. สวัสดี ฉันมีโปรเจกต์ที่รันด้วยเวอร์ชัน 2.0.3 บน GH runner ที่ใช้เอนจิน 29.1 และมันทำงานได้ ทุกคนช่วยตรวจสอบหน่อยได้ไหมว่ามีความขัดแย้งของเวอร์ชันหรือไม่ โปรดจำไว้ว่าโมดูลทั้งหมดมีคำนำหน้าด้วย`testcontainers-. ดังนั้น เริ่มตั้งแต่เวอร์ชัน 2.x เราก็เปลี่ยนจาก`postgresql to testcontainers-postgresql Please provide the French text you’d like me to translate.

คำตอบนี้มีข้อมูลสำคัญสองรายการขออภัยครับ คุณยังไม่ได้ระบุข้อความภาษาฝรั่งเศสที่ต้องการให้แปล กรุณาใส่ข้อความที่ต้องการแปลด้วยครับ

  1. Testcontainers 2.0.3+ แก้ไขปัญหานี้

  2. โมดูลได้ถูกถูกเปลี่ยนชื่อโดยมีคำนำหน้า `testcontainers-

เฟส 3 : กับดักของอาร์ติแฟกต์ที่ถูกเปลี่ยนชื่อ

การเปลี่ยนชื่อครั้งนี้รุนแรงมาก ใน Testcontainers 2.x ไม่มีชื่อเก่าใด ๆ ที่ยังใช้งานได้ภายใต้ชื่อนั้นอีกต่อไป:

ชื่อเดิม (1.x) ชื่อใหม่ (2.x)

org.testcontainers:postgresql

org.testcontainers:testcontainers-postgresql

org.testcontainers:jdbc

org.testcontainers:testcontainers-jdbc

org.testcontainers:junit-jupiter

org.testcontainers:testcontainers-junit-jupiter

org.testcontainers:testcontainers

ไม่เปลี่ยนแปลง

ความพยายามครั้งแรก: ใช้ BOM Testcontainers 2.0.5 และชื่ออาร์ติแฟกต์ใหม่ใน`build.gradle`.

dependencies {
    testImplementation platform("org.testcontainers:testcontainers-bom:2.0.5")
    testImplementation "org.testcontainers:testcontainers-postgresql"
    testImplementation "org.testcontainers:testcontainers-jdbc"
    testImplementation "org.testcontainers:testcontainers-junit-jupiter"
    testImplementation "org.testcontainers:testcontainers"
}

./gradlew build

FAILURE: Could not find org.testcontainers:jdbc:2.0.5.
Could not find org.testcontainers:junit-jupiter:2.0.5.

BOM ของ testcontainers-bom ไม่เพียงพอทำไม? เพราะ Spring Boot 3.4.5 มี BOM สำหรับจัดการ dependency ของตัวเอง (spring-boot-dependencies) ที่ชนะเกี่ยวกับ BOM ของ Testcontainers ในการ resolve แบบ transitive Spring Boot กำหนด`testcontainers` à 1.20.6, และดังนั้นอาร์ติแฟกต์ทั้งหมดที่ไม่ได้ระบุอย่างชัดเจนใน BOM ของ Spring Boot (เช่นอาร์ติแฟกต์ใหม่`testcontainers-*) แปลงเป็นชื่อเดิม`1.20.6-- ซึ่งไม่มีอยู่ในเวอร์ชันนี้แล้ว

ขณะตรวจสอบ`dependencies --configuration testRuntimeClasspath`, จะพบว่า:

+--- org.testcontainers:testcontainers -> 1.20.6 (*)
|    \--- org.testcontainers:testcontainers:2.0.5 -> 1.20.6

Le `→`ระบุการแทนที่: Testcontainers 2.0.5 ถูก ร้องขอ แต่ Spring Boot บังคับ`1.20.6`The text to be translated is missing. Please provide the French text you would like translated into Thai.

@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false
skinparam componentStyle rectangle

left to right direction

component "build.gradle\n(consommateur)" as BG #E3F2FD {
    rectangle "demande\n`testcontainers-bom:2.0.5`" as REQ
    rectangle "demande\n`testcontainers-postgresql`" as REQ2
}

component "Maven Central" as MC #FFF3E0

component "Déclarations" as DEC #E8F5E9 {
    rectangle "`testcontainers-bom:2.0.5`\nfixe 2.0.5" as BOM2
    rectangle "`spring-boot-dependencies:3.4.5`\nfixe 1.20.6" as BOM1
}

component "Résolution Gradle" as RES #FFEBEE {
    rectangle "Version gagnante\n`testcontainers:1.20.6`" as WIN #EF9A9A
}

BG --> DEC : "analyse les BOMs"
BOM2 --> RES : "propose 2.0.5"
BOM1 --> RES : "propose 1.20.6"
WIN -> MC : "télécharge\ntestcontainers:1.20.6"

note bottom of WIN
  Spring Boot BOM prime car
  le plugin spring-boot applique
  ses dépendances de gestion
  après la résolution du consommateur
end note

@enduml

เฟส 4 : บังคับความละเอียด

กลยุทธ์กลายเป็นสองแนวทาง:

  1. บังคับให้ docker-java เป็นเวอร์ชัน 3.7.1 (ทดสอบแล้วว่าเข้ากันได้กับ Docker Engine 29)

  2. บังคับ Testcontainers core เป็น 2.0.5 โดยข้าม BOM ของ Spring Boot

@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false
skinparam componentStyle rectangle

left to right direction

component "build.gradle\n(avec resolutionStrategy)" as BG #E8F5E9 {
    rectangle "BOM Testcontainers\n`2.0.5`" as BOM2
    rectangle "`resolutionStrategy\n.eachDependency`" as RS #66BB6A
}

component "Conflit résolu" as RESOLVED #E3F2FD {
    rectangle "docker-java\n`3.7.1` (forcé)" as DJ
    rectangle "testcontainers\n`2.0.5` (forcé)" as TC #81C784
    rectangle "testcontainers-postgresql\n`2.0.5`" as TPG
    rectangle "testcontainers-jdbc\n`2.0.5`" as TJ
    rectangle "testcontainers-junit-jupiter\n`2.0.5`" as TJJ
}

component "BOM Spring Boot\n(implicite, outrepassé)" as BOM1 #FFEBEE

component "Maven Central" as MC #FFF3E0

BG --> RESOLVED : "BOM Testcontainers 2.0.5\npasse directement"
RS -> DJ : "force 3.7.1"
RS -> TC : "force 2.0.5"
RESOLVED --> MC : "télécharge les JARs\ncompatibles Docker 29"
BOM1 -[#gray,dashed]-> RESOLVED : "ignoré sur testcontainers\net docker-java"

note bottom of RS
  Le `eachDependency` intercepte
  la résolution Gradle AVANT
  que le BOM Spring Boot ne gagne.
  C'est une intervention chirurgicale.
end note

@enduml

การแก้ไขขั้นสุดท้ายใน`build.gradle`Please provide the French text you’d like me to translate into Thai.

configurations {
    all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == "com.github.docker-java"
                && details.requested.name.startsWith("docker-java")) {
                details.useVersion("3.7.1")
            }
            if (details.requested.group == "org.testcontainers"
                && details.requested.name == "testcontainers") {
                details.useVersion("2.0.5")
            }
        }
    }
}

dependencies {
    testImplementation platform("org.testcontainers:testcontainers-bom:2.0.5")
    testImplementation "org.testcontainers:testcontainers-jdbc"
    testImplementation "org.testcontainers:testcontainers-junit-jupiter"
    testImplementation "org.testcontainers:testcontainers-postgresql"
    testImplementation "org.testcontainers:testcontainers"
    // ... autres dépendances Spring Boot
}

Le `resolutionStrategy.eachDependency`เป็นวิธีเดียวที่จะข้าม BOM`spring-boot-dependencies`จัดการโดยปลั๊กอิน Spring Boot การทดสอบความเท่ากันบน`details.requested.name == "testcontainers"`ถูกจำกัดโดยเจตนา: เราบังคับเฉพาะโมดูล core เท่านั้น โมดูล`testcontainers-*`เป็นไปตาม BOM ของ Testcontainers 2.0.5 ที่เราได้ประกาศไว้อย่างชัดเจน

ผลลัพธ์สุดท้าย

$ ./gradlew build --no-daemon

> Task :consoleLauncherTest
[2 containers found]
[2 containers started]
[2 containers successful]

BUILD SUCCESSFUL in 1m 16s

Testcontainers 2.0.5 + docker-java 3.7.1 ในที่สุดก็สามารถสร้างคอนเทนเนอร์ PostgreSQL ของตนผ่าน Docker Engine 29.4.1 ได้แล้ว ข้อผิดพลาดทางธุรกิจขั้นสุดท้าย (HTTP 500 ในการทดสอบ Cucumber) เป็นปัญหาของแอปพลิเคชันที่ไม่เกี่ยวข้องกับ build script โดยสิ้นเชิง

ตารางสรุปการแก้ไข

Please provide the French text you’d like me to translate into Thai. ไฟล์ ปัญหา การแก้ไข

1

buildSrc/src/main/groovy/jhipster.cucumber-conventions.gradle

ตัวแปร`reportsDir`ที่ไม่มีอยู่

outputs.dir(cucumberReportsDir)

2

buildSrc/src/main/groovy/jhipster.cucumber-conventions.gradle

`main`Gradle 9 ที่เลิกใช้แล้ว

mainClass

3

build.gradle

`sourceCompatibility`top-level ถูกห้ามใน Gradle 9

บล็อก`java { sourceCompatibility = JavaVersion.VERSION_21 }`

4

build.gradle

Assertion Groovy ที่ไม่ถูกต้องตามไวยากรณ์

assert …​ in ["17", "21", "23", "24"]

5

build.gradle

การพึ่งพาโดยนัย`compileKotlin`The source text to translate appears to be missing. Please provide the French text you’d like translated to Thai.openApiGenerate

afterEvaluate { tasks.named("compileKotlin").dependsOn("openApiGenerate") }

6

gradle.properties

`gitPropertiesPluginVersion`ไม่เข้ากันกับ Java 21

2.5.7

7

แคช Gradle

docker-java 3.5.1 ทดสอบแล้ว แก้ไขแล้วแต่ยังไม่เพียงพอ

Purge + การเปลี่ยนไปใช้ docker-java 3.7.1

8

build.gradle

Testcontainers 1.20.6 เข้ากันไม่ได้กับ Docker Engine 29

การบังคับใช้ Testcontainers 2.0.5 + prefix`testcontainers-*`+ resolutionStrategy เทียบกับ Spring Boot BOM

บทสรุป

หากบิลด์ JHipster/Gradle ของคุณล้มเหลวหลังจากอัปเกรดเป็น Gradle 9 + Docker Engine 29 ข้อผิดพลาดจะแบ่งออกเป็นสองประเภท:

ข้อผิดพลาดของสคริปต์ build(6 ข้อแรก) : Gradle 9 ลบคุณสมบัติและไวยากรณ์ที่ใช้งานได้มาหลายปี (sourceCompatibility=, main =, reportsDir). สิ่งเหล่านี้เป็นการย้ายข้อมูลเชิงกลไกเมื่อรู้จัก API ใหม่แล้ว

ข้อผิดพลาดรันไทม์ของ Docker(2 รายการหลัง) : Docker Engine 29.4.1 ตัดไคลเอนต์ API ที่ < 1.40 ออก Testcontainers 1.20.6 (ถูกกำหนดโดย Spring Boot 3.4.5) ใช้ docker-java 3.4.1 ซึ่งส่ง 1.32 มีเพียง Testcontainers 2.0.5 + docker-java 3.7.1 เท่านั้นที่แก้ปัญหาได้ โดยมีการเปลี่ยนชื่อ artifacts และบังคับเวอร์ชันผ่าน`resolutionStrategy.eachDependency`เป็นวิธีเดียวที่จะหลีกเลี่ยง BOM โดยนัยของ Spring Boot

สคริปต์บิลด์ Gradle ที่รากของโปรเจกต์ตอนนี้สะอาดแล้ว`./gradlew build`เปลี่ยนไปใช้ Java 21, Gradle 9.4.1, Spring Boot 3.4.5 และ Docker Engine 29.4.1

บทความที่เกี่ยวข้อง