Quand Gradle 9, Docker 29 et Testcontainers se mettent la rate au court-bouillon : debugging d'un build JHipster
เผยแพร่เมื่อ 25 April 2026
- ฉาก: โปรเจกต์ JHipster, บิลด์ที่ไม่โหลดอีกต่อไป
- ข้อผิดพลาด 1: ตัวแปรผี `reportsDir
- ข้อผิดพลาด 2:
main = "…"ไม่มีอยู่แล้วใน Gradle 9 - ข้อผิดพลาด 3:
sourceCompatibilityไม่ใช่คุณสมบัติของโปรเจกต์อีกต่อไป - ข้อผิดพลาด 4: การยืนยัน Groovy แบบสามตัวถูกดำเนินการ
- ข้อผิดพลาด 5: การพึ่งพาโดยนัย
compileKotlin→ `openApiGenerate - ข้อผิดพลาด 6:
generateGitPropertiesล้มเหลวที่ `FilterOutputStream.write() - ในที่สุด: Testcontainers ก็เข้าสู่ฉาก
- ระยะที่ 1 : แนวทาง docker-java
- ระยะที่ 2: การค้นหาเว็บและเบรดครัมบ์ GitHub
- เฟส 3 : กับดักของอาร์ติแฟกต์ที่ถูกเปลี่ยนชื่อ
- เฟส 4 : บังคับความละเอียด
- ผลลัพธ์สุดท้าย
- ตารางสรุปการแก้ไข
- บทสรุป
เวลาอ่าน : 15 minutes
คุณเคยผ่านช่วงเวลาที่เพียง`./gradlew build`ที่คุณรันวันละร้อยครั้งจู่ๆ ก็พังด้วยข้อผิดพลาดที่ไม่เคยเห็นมาก่อน? คูณมันด้วยข้อผิดพลาดต่อเนื่องสิบเอ็ดครั้ง เพิ่มความไม่เข้ากันของ Docker Engine 29 เข้าไปเต็มๆ โรยด้วย Gradle 9 ที่ทำให้ API ที่เราใช้มานานสิบปีหายไป นี่คือบันทึกการเดินทางฉบับสมบูรณ์
แผนภาพที่ 1 — การย้ายไปยัง Gradle 9 (ห่วงโซ่ข้อผิดพลาด)
วัตถุประสงค์: เพื่อแสดงชุดของความไม่เข้ากัน
@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
วัตถุประสงค์: แยกปลั๊กอินที่เสียหายออก
@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
วัตถุประสงค์: ปัญหารันไทม์
@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
ผลลัพธ์แรกทันที:
-
testcontainers-java#11210—
[Bug]: client version 1.32 is too old. Minimum supported API version is 1.44 -
testcontainers-java#11212—
[Bug]: Docker 29.0.0 could not find a valid Docker environment -
testcontainers-java#11491—
[Bug]: Incompatibility in Ubuntu Github runners with Docker Engine 29.1.*
เส้นทางนั้นชัดเจน: 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.
คำตอบนี้มีข้อมูลสำคัญสองรายการขออภัยครับ คุณยังไม่ได้ระบุข้อความภาษาฝรั่งเศสที่ต้องการให้แปล กรุณาใส่ข้อความที่ต้องการแปลด้วยครับ
-
Testcontainers 2.0.3+ แก้ไขปัญหานี้
-
โมดูลได้ถูกถูกเปลี่ยนชื่อโดยมีคำนำหน้า `testcontainers-
เฟส 3 : กับดักของอาร์ติแฟกต์ที่ถูกเปลี่ยนชื่อ
การเปลี่ยนชื่อครั้งนี้รุนแรงมาก ใน Testcontainers 2.x ไม่มีชื่อเก่าใด ๆ ที่ยังใช้งานได้ภายใต้ชื่อนั้นอีกต่อไป:
| ชื่อเดิม (1.x) | ชื่อใหม่ (2.x) |
|---|---|
|
|
|
|
|
|
|
ไม่เปลี่ยนแปลง |
ความพยายามครั้งแรก: ใช้ 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 : บังคับความละเอียด
กลยุทธ์กลายเป็นสองแนวทาง:
-
บังคับให้ docker-java เป็นเวอร์ชัน 3.7.1 (ทดสอบแล้วว่าเข้ากันได้กับ Docker Engine 29)
-
บังคับ 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 |
|
ตัวแปร`reportsDir`ที่ไม่มีอยู่ |
|
2 |
|
`main`Gradle 9 ที่เลิกใช้แล้ว |
|
3 |
|
`sourceCompatibility`top-level ถูกห้ามใน Gradle 9 |
บล็อก`java { sourceCompatibility = JavaVersion.VERSION_21 }` |
4 |
|
Assertion Groovy ที่ไม่ถูกต้องตามไวยากรณ์ |
|
5 |
|
การพึ่งพาโดยนัย`compileKotlin`The source text to translate appears to be missing. Please provide the French text you’d like translated to Thai. |
|
6 |
|
`gitPropertiesPluginVersion`ไม่เข้ากันกับ Java 21 |
|
7 |
แคช Gradle |
docker-java 3.5.1 ทดสอบแล้ว แก้ไขแล้วแต่ยังไม่เพียงพอ |
Purge + การเปลี่ยนไปใช้ docker-java 3.7.1 |
8 |
|
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