pড়ার সময় : 15 minutes

আপনি ইতিমধ্যে সেই মুহূর্তটি অনুভব করেছেন যেখানে একটি সহজ`./gradlew build`আপনি যদি দিনে একশো বার চালান, তা একদম একটি কখনো না Seen ত্রুটিতে crash করা শুরু করে ? একাদশ পরপর ত্রুটির গুণফল নিয়ে, ডকার ইঞ্জিন ২৯-র অসংসাম্য এর একটি ভালো ডোজ যোগ করুন, গ্রেডল 9 ছড়িয়ে দিন যা দশ বছর যাবতীয়ভাবে ব্যবহৃত API গুম করে দেন। এটি পুরোপুরি লগবুক।


ডায়াগ্রাম ১ — মাইগ্রেশন গ্রেডেল ৯ (ত্রুটির শৃঙ্খলা)

উদ্দেশ্য: অসংগতির শ্রেণী দেখানো।

👉 স্পষ্ট, 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

ডায়াগ্রাম ২ — অসামঞ্জস্যপূর্ণ 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\nVersions\nসংশোধিত" as C #E3F2FD
rectangle "4\nAssemble OK" as D #E8F5E9

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

@enduml

ডায়াগ্রাম 3 — Docker 29 / Testcontainers

উদ্দেশ্য: runtime সমস্যা।

👉 রানটাইমের স্পষ্ট ইতিহাস.
@startuml
left to right direction
title Docker 29 + Testcontainers

skinparam shadowing false
skinparam roundcorner 18
skinparam defaultFontSize 14

rectangle "1\nAssemble OK" as A #E8F5E9
rectangle "2\nTests Cucumber FAIL" as B #FFEBEE
rectangle "3\nTestcontainers 1.32\nপ্রত্যাখ্যাত" as C #FFF3E0
rectangle "4\nআপগ্রেড\nভার্সন" as D #E3F2FD
rectangle "5\nBuild final 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 টেস্ট ব্যর্থ (KO)
Docker ইমেজ প্রত্যাখ্যাত
libs আপগ্রেড
end note

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

@enduml

পরিস্থিতি : একটি JHipster প্রকল্প, একটি বিল্ড যা আর লোড হয় না

প্রকল্প`edster`এটি 2024 সালে জেনারেটেড JHipster অ্যাপ্লিকেশন। মূল বিল্ড স্ক্রিপ্ট`build.gradle`এটি মাসে মাসে স্থির ছিল। তারপর তারা সংস্করণ আপগ্রেড করতে সিদ্ধান্ত নেয়।

উপাদান লক্ষ্য সংস্করণ

Gradle

9.4.1

Java

21.0.11-tem (Eclipse Temurin)

JHipster

8.x (ফ্রেমওয়ার্ক`tech.jhipster:jhipster-framework:8.11.0`)

Spring Boot

3.4.5

কটলিন

2.3.0

Docker Engine

29.4.1 (API 1.54)

জাভা সংস্করণের পরিবর্তন 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'

আমরা বিল্ড স্ক্রিপ্টের লোডিং থেকে এVEN উড়ে যাই না।buildSrc/src/main/groovy/jhipster.cucumber-conventions.gradle.

.

ত্রুটি ১ : অদৃশ্য ভেরিয়েবল `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`-- যেখানেও সংজ্ঞায়িত করা হয়নি.

সংশোধন : outputs.dir(cucumberReportsDir)

ত্রুটি ২: 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"`

ত্রুটি ৩ : sourceCompatibility এখন একটি প্রকল্পের বৈশিষ্ট্য নয়

নতুন ত্রুটি :

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

মূল স্ক্রিপ্ট ছিল :

sourceCompatibility=17
targetCompatibility=17

Gradle 9 রুট লেভেল থেকে এই প্রপার্টিগুলো মুছে ফেলে। এগুলোকে একটি ব্লকে রাখতে হবে।java.

সংশোধন :

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

ত্রুটি ৪ : Groovy ত্রিভুক্ত দাবি

পুরনো স্ক্রিপ্টে ছিল :

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

গ্রুভি,"21" et "24"`স্ট্রিংস truthy। অভিব্যক্তি সমাধান হয়(…​ == "17") || true || true`, যে সদা সত্য — কিন্তু সিনট্যাক্স অমিল আশিত কঠোর দাবির জন্য

সংশোধন:

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

ত্রুটি 5 : অস্পষ্ট নির্ভরতা compileKotlin → `openApiGenerate

বিল্ড প্রগ্রেস হচ্ছে। কোটলিন কোম্পাইলেশন সফল। তারপর :

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

Gradle 9 কাজের মধ্যে নিহিত নির্ভরতা প্রত্যাখ্যাত করে। যেহেতু`compileKotlin`উৎপন্ন উৎস পড়ে`openApiGenerate`, এটি ঘোষণা করা দরকার।

সংশোধনঅন্দরে`build.gradle`:

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

Le `afterEvaluate`কারণ প্রয়োজন`openApiGenerate`একটি এক্সটেনশন (plugin OpenAPI Generator) এবং কনফিগারেশন পর্বের সময় সরাসরি অ্যাক্সেসযোগ্য কোনো টাস্ক নয়।

ভুল ৬: generateGitProperties FilterOutputStream.write()-এ ব্যর্থ হয়

জাভা কম্পাইলেশন সফল হয়। উপকরণগুলি প্রক্রিয়া করা হয়। তারপরে :

> Task :generateGitProperties FAILED

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

প্লাগইনটি`gradle-git-properties`version 2.5.0 Java 21 / Gradle 9-এ অসমঞ্জস. একটি অভ্যন্তরীন বাগ কল করার চেষ্টা করছে`write(int)`Groovy এর মাধ্যমে একটি প্রবাহ যা তা বন্ধ

শোধনমধ্যে`gradle.properties` :

gitPropertiesPluginVersion=2.5.7

অবশেষে : Testcontainers পর্বে আসে

একেবার পর্যন্ত, এটি শুদ্ধ "build script debugging" ছিল। প্রতিটি ত্রুটি বিল্ড স্ক্রিপ্টে 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"}
@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false

actor "টেস্টকনটেইনারস\n1.20.6" as TC
participant "docker-java\n3.4.1" as DJ
participant "Docker ইঞ্জিন\n29.4.1" as DE

TC -> DJ : নতুন DockerClient()
DJ -> DE : GET /_ping\nUser-এজেন্ট: docker-java/3.4.1\nAPI-ভার্সন: 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 : কোনো বৈধ nDocker পরিবেশ খুঁজে পাওয়া যায়নি

note right of DE
Docker Engine 29.x impose
API minimum = 1.40
(পূর্বের ডিফল্ট : 1.24)
end note

note left of DJ
docker-java 3.4.1 পাঠায় hardcoded API সংস্করণ 1.32 শিরোনামে HTTP
end note

@enduml
@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false

actor "Testcontainers\n1.20.6" as TC
participant "docker-java\n3.4.1" as DJ
participant "Docker ইঞ্জিন\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

ফেজ ১ : ডকার-জাভা পাথ

প্রথম ধাপ: Testcontainers‑এর द्वारा ব্যবহৃত জাভা ডকার ক্লায়েন্ট API সংস্করণ পাঠায়।1.32`তার HTTP handshake-এ, কিন্তু Docker Engine 29.4.1 ন্যূনতম চাহিশ`1.40. সমস্যা ক্লায়েন্ট স্তরে আছে, ড্যামন নয়।

Testcontainers 1.20.6によって समाधित docker-java संस्करण जाँच :

$ ./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:

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

বিল্ডটি পুনরায় চালু করুন। একই ত্রুটি:`client version 1.32 is too old`.

গ্রেডল ক্যাশ যাচাই : JAR ফাইলগুলো সঠিকভাবে পুনরায় ডাউনলোড করা হয়েছে, কিন্তু ত্রুটি বজায় থাকে। docker-java 3.5.1 এখনও পাঠায়`1.32`. এই সংস্করণ তাই Docker Engine 29.4.1-এর জন্য পর্যাপ্ত নয়।

শুচিকরন Kriya:গ্রেডল ক্যাশটি সম্পূর্ণরূপে খালি করুন, নিশ্চিত থাকতে হলে :

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

পরিষ্কার করার পর পূর্ণ পুনরায় চালু। একই ত্রুটি।

ফেজ ২ : ওয়েব অনুসন্ধান এবং ব্রেডক্রাম্ব GitHub

docker-java 3.5.1 পর্যাপ্ত নেই। শুধু এই সমস্যার সমাধান করেছেন কি না খুজে বের করতে হবে।

টেস্টকনটেইনرز-জাভা ও ডকর-জাভা ইসুয়ার লক্ষ্য-নির্ধারিত অনুসন্ধান:

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 সংস্করণের চুক্তি করে, পাঠiye`1.32`. ডেমন ভদ্রভাবে কিন্তু দৃঢ়ভাবে প্রত্যাখ্যান করে।

ইস্যু #11491-এ, একজন মেইনটেইনার উত্তর দিয়েছেন:

_ হাই, আমার একটি প্রকল্প 2.0.3 সংস্করণে একটি GH রান্নারে ইঞ্জিন 29.1 দিয়ে চালু আছে এবং এটি কাজ করে। অনুগ্রহ করে আপনারা পরীক্ষা করুন যে কোনো সংস্করণের সংঘর্ষ নেই? অনুগ্রহ করে মনে রাখবেন, সমস্ত মডিউলের আগে একটি প্রিফিক্স ছিল`testcontainers-. সুতরাং, ভার্সন 2.x থেকে শুরু করে আমরা থেকে`postgresql to testcontainers-postgresql _

এই উত্তর ধারণ করেদুটি গুরুত্বপূর্ণ তথ্য :

  1. Testcontainers 2.0.3+ সমস্যা সমাধান

  2. মডিউলগুলো ছিলprefix testcontainers- দিয়ে নামকৃত

প্যায় ৩: নাম পরিবর্তিত আর্টিফ্যাক্টের জাল

নাম পরিবর্তনটি কঠিন। 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.

testcontainers-bom BOM কাফি নেইকেন? Spring Boot 3.4.5 তার নিজের BOM (বিল্ড অফ মেটেরিয়াল) নির্ভরতা ব্যবস্থাপনা প্রদর্শন করে (spring-boot-dependencies) কেজয়িতটেস্টকন্টেইনার্স BOM-এ ট্রানজিটিভ রেজোলিউশনে। Spring Boot ঠিক করে`testcontainers` à 1.20.6, সুতরাং স্প্রিং বুটের BOM-এ স্পষ্টভাবে অন্তর্ভুক্ত না হওয়া সব আর্টিফ্যাক্ট (যekar nuevos_groups`testcontainers-*) পুরাতন নামের দিকে সমাধান হয়`1.20.6-- এই সংস্করণে আর নেই।

পরীক্ষার সময়ে`dependencies --configuration testRuntimeClasspath`,あります:

+--- org.testcontainers:testcontainers -> 1.20.6 (*)
|    \--- org.testcontainers:testcontainers:2.0.5 -> 1.20.6
@startuml
skinparam backgroundColor #FEFEFE
skinparam handwritten false
skinparam componentStyle rectangle

left to right direction

component "build.gradle\n(consommateur)" as BG #E3F2FD {
    rectangle "অনুরোধ\n`testcontainers-bom:2.0.5`" as REQ
    rectangle "অনুরোধ\n`testcontainers-postgresql`" as REQ2
}

component "Maven কেন্দ্রীয়" as MC #FFF3E0

component "বক্তব্য" as DEC #E8F5E9 {
    rectangle "`testcontainers-bom:2.0.5`\nস্থির 2.0.5" as BOM2
    rectangle "`spring-boot-dependencies:3.4.5`\nস্থির 1.20.6" as BOM1
}

component "সমাধান Gradle" as RES #FFEBEE {
    rectangle "জয়ী সংস্করণ\n`testcontainers:1.20.6`" as WIN #EF9A9A
}

BG --> DEC : "বিশ্লেষণ করে BOMs"
BOM2 --> RES : "প্রস্তাব করে 2.0.5"
BOM1 --> RES : "প্রস্তাব করে 1.20.6"
WIN -> MC : "ডাউনলোড করে\ntestcontainers:1.20.6"

note bottom of WIN
Spring Boot BOM prime car
স্প্রিং-বুট প্লাগইন প্রয়োগ করে
তার ব্যাবস্থাপনা নির্ভরতা
উপভোক্তার সমাধানের পরে
end note

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

left to right direction

component "build.gradle\n(ব্যবহারকারী)" as BG #E3F2FD {
    rectangle "অনুরোধ\n`testcontainers-bom:2.0.5" as REQ
    rectangle "অনুরোধ\n`testcontainers-postgresql" as REQ2
}

component "Maven Central" as MC #FFF3E0

component "ghoshanabolī" as DEC #E8F5E9 {
    rectangle "testcontainers-bom:2.0.5`\nনিরীহারিত 2.0.5" as BOM2
    rectangle "spring-boot-dependencies:3.4.5`\nঠিক করে ১.২০.৬" as BOM1
}

component "গ্রেডল সমাধান" as RES #FFEBEE {
    rectangle "জয়ী সংস্করণ\n`testcontainers:1.20.6" as WIN #EF9A9A
}

BG --> DEC : "BOMs বিশ্লেষণ কর"
BOM2 --> RES : "প্রস্তাব কর ২.০.৫"
BOM1 --> RES : "প্রস্তাব 1.20.6"
WIN -> MC : "ডাউনলোড\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 : সমাধানকে বাধ্য করুন

রৌনক কৌশল দ্বিগুণ হয়ে যায় :

@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 "সংঘর্ষ সমাধান হল" as RESOLVED #E3F2FD {
    rectangle "docker-java\n`3.7.1` (বাধ্য)" as DJ
    rectangle "testcontainers\n`2.0.5` (বাধ্য)" 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 স্প্রিং বুট\n(implicite, outrepassé)" as BOM1 #FFEBEE

component "Maven Central" as MC #FFF3E0

BG --> RESOLVED : "BOM Testcontainers 2.0.5\nসরাসরি পাস হয়"
RS -> DJ : "শক্তি 3.7.1"
RS -> TC : "বাধ্য করুন 2.0.5"
RESOLVED --> MC : "ডাউনলোড কর JARs\nসামঞ্জস্য Docker 29"
BOM1 -[#gray,dashed]-> RESOLVED : "উপেক্ষাকৃত testcontainers\net docker-java"

note bottom of RS
`eachDependency` একটি রেজোলিউশন Gradle AVANT আপস করে নেয়, যা BOM Spring Boot জেতে পারে না।
এটি একটি শাল্য চিকিৎসার হস্তক্ষেপ।
end note

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

left to right direction

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

component "সংঘাত সমাধান" as RESOLVED #E3F2FD {
    rectangle "docker-java\n`3.7.1` (বাধ্যতামূলক)" as DJ
    rectangle "testcontainers\n`2.0.5` (বাধাপ্রাপ্ত)" 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(অপ্রকাশিত, অবরাইড)" as BOM1 #FFEBEE

component "Maven Central" as MC #FFF3E0

BG --> RESOLVED : "BOM Testcontainers 2.0.5\nসরাসরি যায়"
RS -> DJ : "বল 3.7.1"
RS -> TC : "বল 2.0.5"
RESOLVED --> MC : "JARs ডাউনলোড কর\nDocker 29-সামঞ্জস্যপূর্ণ"
BOM1 -[#gray,dashed]-> RESOLVED : "অবহেলিত উপরে testcontainers\nএবং 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`:

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`একমাত্র উপায় বটিওএম বাইপাস করতে`spring-boot-dependencies`Spring Boot প্লাগইন tarafından পরিচালিত। সমতা পরীক্ষা উপর`details.requested.name == "testcontainers"`এটি ইচ্ছামত সীমাবদ্ধকৃত: আমরা শুধুমাত্র কোর মডিউলই বাধ্য করি। মডিউলগুলো`testcontainers-*`যারা স্পষ্টভাবে ঘোষিত Testcontainers 2.0.5 BOM অনুসরণ করে

শেষ ফল

$ ./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 মাধ্যমে তৈরি করতে সক্ষম হয়। শেষ ব্যবসায়িক ত্রুটি (Cucumber টেস্টে HTTP 500) একটি সম্পূর্ণভাবে বিল্ড স্ক্রিপ্ট থেকে স্বাধীন অ্যাপ্লিকেশন সমস্যা।

সংশোধনের সারাংশ টেবিল

# ফাইল সমস্যা সংশোধন

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

অ্যাসার্ট Groovy সিনট্যাক্সে অযুগ্ম

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

5

build.gradle

অস্পষ্ট নির্ভরতা`compileKotlin`→openApiGenerate

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

6

gradle.properties

`gitPropertiesPluginVersion`অসংগত Java 21

2.5.7

7

Cache Gradle

docker-java 3.5.1 পরীক্ষিত, সমাধান করা হয়েছে কিন্তু পর্যাপ্ত নয়

শোধন + পরিবর্তন docker-java 3.7.1

8

build.gradle

Testcontainers 1.20.6 Docker Engine 29-এর সাথে অসংগত

বল্যাপান Testcontainers 2.0.5 + prefix`testcontainers-*`+ resolutionStrategy vs Spring Boot BOM

উপসংহার

আপনি যদি JHipster/Gradle বিল্ডটি Gradle 9 + Docker Engine 29 সংস্করণে আপগ্রেড করার পরে ক্র্যাশ হয়, তাহলে ত্রুটিগুলি দুটি বিভাগে ভাগ করা হয়:

বিল্ড স্ক্রিপ্টের ত্রুটি(প্রথম ৬টি) : Gradle 9 কিছু প্রোপার্টি এবং সিনট্যাক্সকে মুছে ফেলেছে, যা বছর ধরে কাজ করছিল`sourceCompatibility=, `main =, reportsDir). এগুলো মেকানিকাল মাইগ্রেশন, যা একবার আপনি নতুন API জানলে হয়।

ডকার রানটাইম ত্রুটি(২টি শেষ) : 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 সমস্যার সমাধান করে, আর্টিফ্যাক্টের নামকরণের সাথে এবং সংস্করণ বাধ্য করে via`resolutionStrategy.eachDependency`একমাত্র উপായ作为 Spring Boot এর নিহিত BOM বাইপাস করতে

সম্পর্কিত নিবন্ধ