Gradle 9.8.0 รองรับ Java 27 แล้ว — และยืมค่า mirror จาก Maven ได้
ถ้าคุณเคยนั่งถอนหายใจรอรอบบิลด์โปรเจกต์ Java บนเครื่อง Windows ที่อืดจนลุกไปชงกาแฟเสร็จ หรือเบื่อหน่ายกับการต้องคอยส่งต่อ URL คลังเก็บไลบรารีภายในองค์กรเพื่อไปแปะลงในสคริปต์บิลด์ซ้ำแล้วซ้ำเล่า ข่าวการปล่อยอัปเดตเครื่องมือรอบนี้จะช่วยคืนเวลาชีวิตการทำงานให้คุณได้แบบจับต้องได้ทันทีครับ
ทีมพัฒนา Gradle ได้ปล่อยเวอร์ชันทางการ Gradle 9.8.0 เมื่อวันที่ 24 กันยายน 2026 (ยืนยันผ่านทาง Gradle GitHub release v9.8.0) ซึ่งเกิดขึ้นในช่วงไล่เลี่ยกับการรายงานความเคลื่อนไหวในวงการจาวาของสำนักข่าวสายเทคโนโลยีอย่าง InfoQ Java News Roundup โดยการอัปเกรดในรอบย่อยนี้ไม่ได้มีดีแค่การกระโดดตามรอบการปล่อยของ Java เวอร์ชันล่าสุดอย่าง Java 27 เท่านั้น แต่ยังแอบใส่การปรับปรุงด้านวิศวกรรมที่ลดความซ้ำซ้อนระหว่างเครื่องมือคู่แข่งอย่าง Apache Maven รวมถึงแก้คอขวดบนระบบปฏิบัติการ Windows ที่ฝังลึกมานานอีกด้วยครับ
เกิดอะไรขึ้น (สรุป 30 วินาที)
- รองรับ Java 27 อย่างเป็นทางการ: ทั้งการใช้รันตัวเบื้องหลังอย่าง Gradle daemon และการคอมไพล์ ทดสอบ หรือรันแอปพลิเคชันผ่านระบบ Java toolchains ด้วยคำสั่ง
JavaLanguageVersion.of(27) - ยืมการตั้งค่า Mirror จาก Maven ข้ามฝั่งมาใช้ได้ทันที: เพียงเปิดตัวเลือก
org.gradle.mirror.maven.settings=trueในไฟล์gradle.propertiesตัว Gradle จะไปหยิบค่ากระจกเงาคลังแพ็กเกจ (mirror settings) จากไฟล์คอนฟิกของ Maven มาใช้งานอัตโนมัติ ช่วยลดงานดูแลคอนฟิกของทีมโครงสร้างพื้นฐาน - เร่งความเร็วบน Windows ที่เจอนาฬิการะบบเดินช้าได้สูงสุด 45%: ตัวเอนจินของ Gradle 9.8.0 จะคอยตรวจจับว่าเครื่อง Windows มีปัญหาเรื่องความละเอียดและต้นทุนการเรียกนาฬิการะบบ (slow system clock) หรือไม่ หากพบจะสลับแหล่งอ้างอิงเวลาภายใน ทำให้ประหยัดรอบประมวลผลของซีพียูและลดเวลาการบิลด์ลงอย่างมีนัยสำคัญ
- เปิดตัว
destinationDirectoryแบบ Lazy สำหรับทาสก์ Copy และ Sync: เปลี่ยนการระบุปลายทางโฟลเดอร์ให้เป็นแบบDirectoryProperty(สถานะ incubating) เพื่อสนับสนุนการประเมินค่าแบบผัดผ่อน (lazy evaluation) สอดรับกับ Configuration Cache ได้สมบูรณ์ขึ้น - ทาสก์
GenerateMavenPomรองรับการตรวจสถานะความสดใหม่ (Up-to-date checks): ช่วยให้ไม่ต้องเสียเวลาสร้างไฟล์ข้อมูลเมทาดาทา POM ใหม่ทุกรอบหากไม่มีการเปลี่ยนแปลง ยกเว้นในกรณีที่มีการแก้โครงสร้างไฟล์ผ่านคำสั่งwithXml - รองรับ Groovydoc และตัวเลือกของ Groovy 6: เปิดให้ระบุ
javaVersionเพื่อปรับแต่งเอกสาร API ให้ตรงกับรุ่นภาษาที่ต้องการ - อัปเกรดง่ายผ่าน Gradle Wrapper: ทีมงานสามารถขยับขึ้นมาใช้เวอร์ชัน 9.8.0 ได้ทันทีด้วยการสั่งคำสั่ง
./gradlew :wrapper --gradle-version=9.8.0
ทำไมเรื่องนี้เกี่ยวกับคุณ
เรื่องนี้อาจดูเหมือนข่าวอัปเกรดซอฟต์แวร์ธรรมดาที่นักพัฒนาส่วนใหญ่มักกดข้าม แต่ในความเป็นจริง การเปลี่ยนแปลงชุดนี้กระทบกับผู้มีส่วนได้ส่วนเสียในวงจรการส่งมอบซอฟต์แวร์หลายระดับครับ
ประการแรก สำหรับ โปรแกรมเมอร์สาย Java และ JVM: ปัจจุบันรอบการออกรุ่นของแพลตฟอร์ม Java ก้าวไปข้างหน้าอย่างรวดเร็ว หากเครื่องมือหลักในการสร้างงานอย่าง build tool ปรับตัวตามไม่ทัน นักพัฒนาก็จะไม่สามารถเริ่มทดสอบฟีเจอร์ระดับภาษาใหม่ๆ ใน JDK 27 ได้ การที่ Gradle 9.8.0 ปล่อยการรองรับออกมาตั้งแต่เนิ่นๆ ทำให้ทีมวิจัยและพัฒนาสามารถเตรียมความพร้อมให้กับโค้ดเบสขององค์กรได้ก่อนที่ข้อกำหนดทางธุรกิจจะบังคับให้ต้องย้ายเวอร์ชัน
ประการที่สอง สำหรับ ทีม Platform Engineer และ DevOps ในองค์กรใหญ่: ปัญหาคลาสสิกที่เจอกันแทบทุกที่คือ ในองค์กรเดียวกันมักจะมีทั้งโปรเจกต์ยุคเก่าที่ใช้ Apache Maven และโปรเจกต์ยุคใหม่ที่ใช้ Gradle แต่ทั้งสองระบบจำเป็นต้องดาวน์โหลดแพ็กเกจผ่านคลังภายในบริษัท (Internal Corporate Proxy หรือ Artifact Repository เช่น Nexus หรือ Artifactory) เพื่อความปลอดภัยและการควบคุมสิทธิ์ ที่ผ่านมา แอดมินต้องเขียนคู่มือสองชุด ต้องสร้างสคริปต์เริ่มต้น init.gradle แจกจ่าย หรือคอยตอบคำถามเวลาเด็กฝึกงานหรือพนักงานใหม่ดาวน์โหลดไลบรารีไม่ผ่านเพราะไม่ได้ต่อเน็ตนอก การที่ Gradle 9.8.0 ยอมอ่านคอนฟิกกระจกเงาจาก Maven ช่วยตัดภาระงานซ้ำซ้อนตรงนี้ออกไปได้อย่างมหาศาล
ประการที่สาม สำหรับ นักพัฒนาที่ต้องทำงานบนระบบปฏิบัติการ Windows: ปฏิเสธไม่ได้ว่าในองค์กรจำนวนมาก เครื่องแล็ปท็อปประจำตำแหน่งยังคงผูกติดอยู่กับ Windows ด้วยนโยบายความปลอดภัยของฝ่ายไอที นักพัฒนาหลายคนมักบ่นอุบว่าทำไมโปรเจกต์เดียวกันแท้ๆ พอลองไปรันบนเครื่อง Mac หรือ Linux ของเพื่อนถึงเสร็จไวกว่าอย่างเห็นได้ชัด การค้นพบและแก้ไขปัญหา slow system clock ใน Gradle 9.8.0 ที่ช่วยให้บิลด์เร็วขึ้นได้สูงสุดถึง 45% จึงเป็นการปลดล็อกความเร็วที่นักพัฒนาสาย Windows สัมผัสได้จริงโดยไม่ต้องเปลี่ยนเครื่องใหม่
ประการสุดท้าย สำหรับ ทีมดูแลระบบ CI/CD Pipeline: ในกระบวนการสร้างและเผยแพร่ไลบรารีกลาง การที่ทาสก์อย่าง GenerateMavenPom สามารถตรวจสอบความสดใหม่ของไฟล์ได้โดยไม่ต้องรันเขียนไฟล์ซ้ำทุกรอบ แม้จะช่วยลดเวลาลงไปรอบละไม่กี่วินาที แต่เมื่อคูณด้วยจำนวนครั้งที่คอมมิตโค้ดในองค์กรขนาดใหญ่ที่มีร้อยๆ ไมโครเซอร์วิส ก็สามารถประหยัดเวลาการทำงานของเครื่องแม่ข่าย CI และลดคิวการรอคอยของทีมนักพัฒนาลงไปได้อย่างชัดเจนครับ
ทำงานยังไง (พร้อมอุปมาไทย)
เพื่อให้เข้าใจเบื้องหลังทางเทคนิคอย่างถ่องแท้ เรามาเจาะดูรายละเอียดแต่ละส่วนพร้อมภาพเปรียบเทียบในชีวิตประจำวันแบบไทยๆ กันครับ
1. การรองรับ Java 27: เหมือนการเปลี่ยนหัวเตาแก๊สโดยไม่ต้องทุบครัวใหม่
ในโลกของ Gradle เราต้องแยกแยะให้ออกระหว่าง สภาพแวดล้อมที่ใช้รันตัว Gradle เอง (Daemon JVM) กับ สภาพแวดล้อมที่ใช้คอมไพล์และทดสอบโค้ดของคุณ (Target/Toolchain JVM)
- เดิมที หากคุณอยากจะคอมไพล์โค้ดที่เขียนด้วยฟีเจอร์ใหม่ล่าสุดอย่าง Java 27 คุณอาจจะต้องรอลุ้นว่าตัวโปรแกรม Gradle เองจะสามารถรันบน JVM เวอร์ชันนั้นได้หรือไม่
- ในเวอร์ชัน 9.8.0 ตัว Gradle daemon ได้รับการทดสอบและรับรองให้ทำงานบน Java 27 ได้อย่างสมบูรณ์แบบ
- ยิ่งไปกว่านั้น ด้วยระบบ JVM Toolchains คุณสามารถระบุคุณสมบัติในสคริปต์บิลด์ เช่น การเรียกใช้
JavaLanguageVersion.of(27)เพื่อสั่งให้ Gradle ไปค้นหา ดาวน์โหลด หรือผูกเข้ากับ JDK 27 ที่ติดตั้งไว้ในเครื่อง เพื่อใช้ในการคอมไพล์และทดสอบโค้ด โดยที่ตัวเอนจินของ Gradle เองอาจจะรันอยู่บน JDK เวอร์ชันอื่นก็ยังได้
เปรียบเสมือนร้านอาหารตามสั่งที่พ่อครัวยังคงใช้โต๊ะเตรียมอาหารและเขียงชุดเดิมที่คุ้นเคย (Daemon) แต่เมื่อมีเมนูผัดไฟแรงกระทะเหล็กสูตรใหม่เข้ามา พ่อครัวก็สามารถสั่งติดตั้งหัวเตาเร่งไฟแรงสูงเฉพาะกิจ (Toolchain Java 27) มาตั้งไว้ตรงมุมครัวเพื่อทำเมนูใหม่ได้ทันที โดยไม่ต้องสั่งปิดร้านแล้วรื้อโครงสร้างครัวทั้งหลังทิ้งครับ
อย่างไรก็ดี สิ่งที่ต้องระวังเป็นพิเศษคือระบบนิเวศของปลั๊กอินภายนอก (Third-party plugins) ตัว Gradle เองอาจจะพร้อมรันและคอมไพล์ Java 27 ได้อย่างไร้รอยต่อ แต่ปลั๊กอินสายตรวจสอบคุณภาพโค้ดหรือแปลงโครงสร้างไบต์โค้ด (เช่น PMD, SpotBugs หรือเครื่องมือจำพวก Byte Buddy) อาจจะยังไม่มีตัวถอดรหัสไบต์โค้ดที่รองรับฟอร์แมตคลาสของ Java 27 ได้ทันที ซึ่งเป็นเรื่องที่ต้องวางแผนทดสอบอย่างรอบคอบ
2. การยืมกระจกเงา Maven: ครัวขนมหวานกับครัวกับข้าว ใช้รหัสเปิดตู้เย็นกลางร่วมกัน
ในองค์กรส่วนใหญ่ มักจะมีการตั้งเซิร์ฟเวอร์กระจกเงา (Corporate Mirror Repository) เอาไว้ในระบบเครือข่ายภายใน เพื่อทำหน้าที่เป็นตัวกลางในการดึงไลบรารีจากโลกภายนอก (เช่น Maven Central) มาสแกนหาช่องโหว่ มัลแวร์ และเก็บแคชสำรองไว้ เพื่อไม่ให้พนักงานทุกคนต้องวิ่งออกไปโหลดตรงจากอินเทอร์เน็ตสาธารณะ
ในโลกของ Apache Maven วิธีการบอกให้โปรแกรมรู้ว่าไม่ต้องออกไปข้างนอก แต่ให้เลี้ยวไปที่เซิร์ฟเวอร์กระจกเงาในบริษัทแทน จะทำผ่านการใส่คอนฟิกแท็ก <mirrors> ลงในไฟล์คอนฟิกผู้ใช้ที่ชื่อ settings.xml (มักจะวางอยู่ที่โฟลเดอร์ ~/.m2/settings.xml) ซึ่งไฟล์นี้โปรแกรมเมอร์มักจะได้มาจากทีมเน็ตเวิร์กตั้งแต่วันแรกที่เข้าทำงาน
แต่สำหรับ Gradle ในอดีตไม่ได้สนใจไฟล์นี้เลย หากองค์กรอยากบังคับให้ทุกคนชี้ไปที่คลังเดียวกัน แอดมินต้องเขียนสคริปต์ init.gradle ไปหยอดไว้ในโฟลเดอร์ ~/.gradle/ หรือไม่ก็ต้องบังคับให้ทุกโปรเจกต์เขียนประกาศ URL ของคลังภายในลงไปในไฟล์ build.gradle ซึ่งมักเกิดปัญหาลืมใส่ หรือคอนฟิกหลุดเวลาเปิดโปรเจกต์ทดลองเล่น
Gradle 9.8.0 ได้นำเสนอทางออกที่เรียบง่ายด้วยการเพิ่มคุณสมบัติ org.gradle.mirror.maven.settings=true ลงในไฟล์ gradle.properties เมื่อเปิดใช้งาน ตัว Gradle จะทำการ:
- แอบไปอ่านไฟล์คอนฟิก
settings.xmlของ Maven ที่มีอยู่แล้วในเครื่อง - ค้นหากฎการสะท้อนที่ระบุไว้ในส่วนของกระจกเงา (Mirrors)
- หากโปรเจกต์ Gradle มีการเรียกใช้คลังภายนอกผ่านโพรโทคอล HTTP หรือ HTTPS ตัว Gradle จะสลับเป้าหมายไปดาวน์โหลดจาก URL ของกระจกเงาที่ระบุไว้ในฝั่ง Maven ให้ทันทีแบบอัตโนมัติ
ลองนึกภาพร้านอาหารขนาดใหญ่ที่มีสองแผนก แผนกขนมหวานใช้สูตรการทำงานแบบ Maven แผนกอาหารคาวใช้สูตรการทำงานแบบ Gradle แต่ทั้งสองแผนกจำเป็นต้องเบิกวัตถุดิบนำเข้าจากห้องเย็นเก็บเสบียงส่วนกลางของบริษัทเดียวกัน เดิมทีผู้จัดการแผนก Gradle ต้องมานั่งคัดลอกแผนที่และเบอร์โทรติดต่อห้องเย็นลงสมุดบันทึกของลูกทีมทุกคนใหม่ทั้งหมด แต่ตอนนี้ เมื่อผู้จัดการบอกว่า “เปิดโหมดยืมสมุดจดของแผนกขนมหวานได้เลย” ลูกทีมฝั่งกับข้าวก็สามารถเปิดดูพิกัดห้องเย็นจากสมุดจดเล่มเดิมของฝั่งขนม แล้วเดินไปเบิกของที่จุดเดียวกันได้ทันที ไม่ต้องเสียเวลาเขียนป้ายบอกทางซ้ำสองรอบ
ข้อจำกัดสำคัญที่เอกสารระบุไว้ชัดเจนคือ คุณสมบัตินี้จะทำงานครอบคลุมเฉพาะคลังแพ็กเกจรูปแบบ Maven ที่สื่อสารผ่าน HTTP และ HTTPS เท่านั้น จะไม่รวมถึงคลังแบบ Apache Ivy, พื้นที่จัดเก็บไฟล์บนคลาวด์อย่าง Amazon S3, Google Cloud Storage (GCS), คลังในเครื่องแบบ mavenLocal() หรือโฟลเดอร์ธรรมดาแบบ flatDir
3. การแก้ปัญหา Slow System Clock บน Windows: เปลี่ยนจากการคอยก้มดูนาฬิกาข้อมือ เป็นการจับจังหวะการหายใจ
หนึ่งในปริศนาที่สร้างความหงุดหงิดให้นักพัฒนาบน Windows มาเนิ่นนานคือ เหตุใดการรันบิลด์ในบางสภาพแวดล้อม (โดยเฉพาะเครื่องคอมพิวเตอร์ที่รันผ่านระบบ Virtual Machine หรือเครื่องที่มีการเปิดโหมดประหยัดพลังงานบางรูปแบบ) ถึงทำงานได้ช้ากว่าปกติอย่างผิดหูผิดตา
เบื้องหลังของเรื่องนี้เกิดจากสิ่งที่เรียกว่า Slow System Clock กล่าวคือ ในการทำงานของ Gradle จะต้องมีการตรวจสอบเวลาอยู่แทบตลอดเวลา ไม่ว่าจะเป็นการตรวจว่าไฟล์ซอร์สโค้ดถูกแก้ไขล่าสุดเมื่อไหร่ การเก็บสถิติความเร็วของแต่ละทาสก์ หรือการบริหารจัดการหน่วยความจำแคชของตัว daemon บนระบบปฏิบัติการ Windows การเรียกถามเวลาผ่านคำสั่งของระบบ (เช่น การเรียก Native API สำหรับอ่านค่าเวลาความละเอียดสูง) อาจมีต้นทุนด้านเวลา (overhead) มหาศาลในบางฮาร์ดแวร์ ส่งผลให้ซีพียูต้องเสียเวลาไปกับการ “ถามเวลาจากระบบปฏิบัติการ” ซ้ำๆ นับแสนนับล้านครั้ง มากกว่าเวลาที่ใช้ในการคอมไพล์โค้ดจริงๆ เสียอีก
ใน Gradle 9.8.0 ทีมพัฒนาได้ใส่ตรรกะการตรวจสอบอัจฉริยะเข้าไป หากพบว่าระบบปฏิบัติการ Windows กำลังตกอยู่ในภาวะที่การอ่านเวลามีต้นทุนสูงผิดปกติ ตัวเอนจินของ Gradle จะสลับไปใช้แหล่งอ้างอิงเวลาทางเลือกที่มีความเร็วสูงกว่าและไม่หน่วงรอบการทำงานของซีพียู ผลลัพธ์ที่ได้คือเวลาในการประมวลผลบิลด์ลดลงอย่างเห็นได้ชัด โดยในบางกรณีสามารถลดลงได้สูงสุดถึง 45%
เปรียบเหมือนคนงานตัดเย็บเสื้อผ้าที่ได้รับคำสั่งว่า “ต้องบันทึกเวลาลงสมุดทุกครั้งที่เย็บกระดุมเสร็จหนึ่งเม็ด” ถ้าคนงานต้องคอยหยุดมือ ก้มลงดูนาฬิกาข้อมือโบราณที่ต้องใช้แว่นขยายส่องทุกเม็ด งานเย็บผ้าทั้งวันก็คงไม่เสร็จสักที แต่เมื่อเปลี่ยนวิธีใหม่ ให้หันมานับจังหวะการเคาะเท้าหรือใช้เสียงสัญญาณบอกเวลาอัตโนมัติ คนงานก็สามารถเย็บผ้าได้อย่างต่อเนื่องโดยไม่ต้องชะงักมือ งานจึงเสร็จไวขึ้นเกือบครึ่งหนึ่งครับ
4. destinationDirectory แบบ Lazy บน Copy และ Sync: สั่งอาหารแบบระบุโต๊ะส่งตอนทำเสร็จ
ในการเขียนสคริปต์ Gradle ยุคใหม่ แนวดคิดเรื่อง Lazy Configuration หรือการประเมินค่าเมื่อจำเป็น คือหัวใจสำคัญของการทำให้ระบบแคชและการคำนวณกราฟงาน (Configuration Cache) ทำงานได้รวดเร็วและถูกต้อง
เดิมที ทาสก์ประเภท Copy หรือ Sync มักจะถูกเขียนด้วยคำสั่งง่ายๆ อย่าง into("โฟลเดอร์ปลายทาง") ปัญหาคือคำสั่งแบบเก่านั้นมักจะถูกประเมินค่าหาตำแหน่งโฟลเดอร์ตั้งแต่ช่วงเริ่มต้นประมวลผลสคริปต์ (Configuration Phase) ซึ่งบ่อยครั้ง โฟลเดอร์ปลายทางนั้นอาจจะยังไม่ได้ถูกสร้างขึ้นมาจริง หรือยังขึ้นอยู่กับผลลัพธ์ของทาสก์อื่นที่ยังรันไม่เสร็จ ส่งผลให้เกิดข้อผิดพลาด หรือทำให้ระบบไม่สามารถแคชผลการทำงานได้อย่างแม่นยำ
ใน Gradle 9.8.0 ได้มีการเปิดตัวคุณสมบัติใหม่ destinationDirectory ซึ่งมีประเภทข้อมูลเป็น DirectoryProperty (ในสถานะ incubating) เพื่อเปิดทางให้นักพัฒนาสามารถผูกปลายทางด้วยอ็อบเจกต์ประเภท Provider<Directory> ได้อย่างเป็นธรรมชาติ
เปรียบเสมือนการเดินไปสั่งอาหารที่ร้านตามสั่งแบบไม่ต้องยืนรอจองโต๊ะล่วงหน้า คุณสามารถเดินไปสั่งกับแม่ครัวไว้ก่อนว่า “ข้าวกะเพราหนึ่งจาน” แล้วค่อยส่งสัญญาณบอกตอนที่อาหารปรุงเสร็จว่าให้ยกไปเสิร์ฟที่โต๊ะไหน เมื่อมีโต๊ะว่างพร้อมรับอาหาร การทำงานจึงไม่ติดขัดและไม่ต้องมีใครมายืนขวางทางหน้าร้านตั้งแต่ช่วงเช้าครับ
5. GenerateMavenPom กับ Up-to-date checks: ใบเสร็จเดิม ถ้าเมนูไม่เปลี่ยน ก็ไม่ต้องเขียนใหม่
เวลาที่เราเขียนไลบรารีและต้องการส่งขึ้นคลังแพ็กเกจ Gradle จะต้องสร้างไฟล์คำอธิบายอย่าง pom.xml เพื่อให้เครื่องมืออื่นๆ ในโลกภายนอกเข้าใจข้อมูลของไลบรารีชิ้นนั้น
ที่ผ่านมา ทาสก์ GenerateMavenPom มักจะทำงานใหม่ซ้ำแล้วซ้ำเล่าทุกครั้งที่สั่งบิลด์ แม้ว่าโค้ด เวอร์ชัน หรือข้อมูลของไลบรารีจะไม่มีอะไรเปลี่ยนไปเลยแม้แต่ตัวอักษรเดียว แต่ใน Gradle 9.8.0 ทาสก์นี้ได้ถูกปรับปรุงให้เข้าร่วมระบบตรวจสอบความสดใหม่ (Up-to-date checks) ของตัวเอนจินอย่างสมบูรณ์ หากข้อมูลนำเข้าทุกอย่างยังคงเดิม ตัว Gradle จะข้ามการทำงานไปเป็นสถานะ UP-TO-DATE ทันที ช่วยประหยัดเวลาการเขียนไฟล์ลงดิสก์
ข้อยกเว้นเพียงอย่างเดียวที่เอกสารระบุไว้คือ หากในสคริปต์บิลด์ของคุณมีการใช้บล็อกคำสั่ง withXml เพื่อเข้าไปดัดแปลงโครงสร้าง XML ของไฟล์ POM ด้วยโค้ดตามใจชอบ ระบบจะไม่สามารถคาดเดาความถูกต้องของผลลัพธ์ได้อย่างปลอดภัย จึงจำเป็นต้องปิดการตรวจสอบความสดใหม่และยอมรันประมวลผลใหม่ตามเดิม
เรื่องเงินและผลกระทบ
แม้ว่า Gradle จะเป็นซอฟต์แวร์โอเพนซอร์สที่เปิดให้ดาวน์โหลดไปใช้งานได้ฟรีโดยไม่มีค่าลิขสิทธิ์ แต่การอัปเดตครั้งนี้ส่งผลต่อ “ต้นทุนแฝง” ทางธุรกิจในหลายมิติอย่างชัดเจนครับ
-
ต้นทุนเวลาการทำงานของวิศวกร (Engineering Productivity Cost): ลองคำนวณง่ายๆ ว่าหากทีมพัฒนาของคุณมีวิศวกรซอฟต์แวร์ 50 คนที่ต้องทำงานบนเครื่อง Windows และแต่ละคนต้องสั่งรันบิลด์เฉลี่ยวันละ 20 ครั้ง หากการแก้ปัญหา slow system clock ช่วยลดเวลาบิลด์ลงได้เฉลี่ยรอบละ 30 วินาทีถึง 1 นาที ในหนึ่งวันทีมจะประหยัดเวลาการนั่งรอไปได้รวมกันหลายชั่วโมง เมื่อคิดเป็นมูลค่าชั่วโมงการทำงานของนักพัฒนา การอัปเกรดนี้เทียบเท่ากับการได้ชั่วโมงการทำงานกลับคืนมามูลค่ามหาศาลในแต่ละเดือน
-
ต้นทุนแบนด์วิดท์เครือข่ายและความเสี่ยงด้านความปลอดภัย (Supply Chain Security & Bandwidth Cost): การเปิดใช้การดึง mirror จาก
settings.xmlของ Maven ช่วยลดความเสี่ยงที่นักพัฒนาจะเผลอดาวน์โหลดไลบรารีตรงจากอินเทอร์เน็ตสาธารณะ การบังคับให้ทราฟฟิกทั้งหมดวิ่งผ่านคลังแคชภายในองค์กรไม่เพียงแต่ช่วยประหยัดค่าใช้จ่ายด้านอินเทอร์เน็ตขาออก (Egress bandwidth) ขององค์กรเท่านั้น แต่ยังช่วยปิดช่องโหว่ความเสี่ยงจากการถูกโจมตีแบบห่วงโซ่อุปทาน (Dependency Confusion หรือ Malicious Package Injection) เพราะแพ็กเกจทุกตัวจะต้องผ่านการตรวจสอบจากเกตเวย์ความปลอดภัยขององค์กรก่อนเสมอ -
ต้นทุนการบริหารจัดการของทีม DevOps (Platform Maintenance Overhead): การลดความซ้ำซ้อนในการดูแลคอนฟิกช่วยลดภาระงานของทีมสนับสนุนด้านไอที (IT Support / Platform Engineers) แทนที่จะต้องคอยรับเรื่องร้องเรียนว่าทำไมบิลด์ของโปรเจกต์ Gradle ไม่ผ่าน หรือทำไมดึงแพ็กเกจไม่ได้ ทีมสามารถใช้โครงสร้างพื้นฐานเดิมของ Maven ที่มีอยู่แล้วมารองรับได้ทันที ลดเวลาในการอบรมพนักงานใหม่และลดความผิดพลาดจากฝีมือมนุษย์ (human error)
ข้อมูลที่ยังไม่ชัด และจุดที่แหล่งข่าวพูดไม่ตรงกัน
จากการรวบรวมข้อมูลจากทั้งเอกสารประกาศทางการของ Gradle, ข้อมูลบน GitHub และบทความสรุปข่าวจาก InfoQ มีข้อสังเกตและประเด็นที่ยังต้องพิจารณาอย่างรอบคอบดังนี้ครับ:
- ความพร้อมของระบบนิเวศภายนอก (Third-party Ecosystem Readiness): เอกสาร Release Notes ของ Gradle ยอมรับไว้อย่างตรงไปตรงมาว่า แม้ Gradle 9.8.0 จะรองรับ Java 27 ได้อย่างสมบูรณ์แบบ แต่ปลั๊กอินยอดนิยมในชุมชนหลายตัว (เช่น PMD หรือเครื่องมือวิเคราะห์โค้ดอื่นๆ) อาจจะยังไม่สามารถทำงานร่วมกับ Java 27 ได้ในทันที แหล่งข่าวภายนอกอย่าง InfoQ ได้เน้นย้ำถึงภาพรวมว่าเครื่องมือในระบบนิเวศกำลังทยอยอัปเดตตามรอบของ JDK แต่ยังไม่มีการกำหนดเส้นตายหรือตารางเวลาที่แน่นอนว่าปลั๊กอินแต่ละตัวจะปล่อยเวอร์ชันที่รองรับเมื่อใด ผู้ใช้จึงต้องระวังไม่เหมารวมว่าการอัปเกรด Gradle จะทำให้เครื่องมือทุกชิ้นในโปรเจกต์พร้อมใช้ Java 27 ได้ทันที
- ความเข้ากันได้ของกฎ Mirror แบบซับซ้อน: ในเอกสารของ Gradle ระบุว่ารองรับการอ่าน mirror จาก
settings.xmlของ Maven สำหรับคลังประเภท HTTP และ HTTPS แต่ไม่ได้ลงรายละเอียดลึกว่า หากในไฟล์คอนฟิกมีการใช้รูปแบบการจับคู่ขั้นสูงของ Maven เช่น การใช้ตัวแทนแบบมีข้อยกเว้น (mirrorOfที่มีเครื่องหมาย*,!repo-idหรือการจับคู่หลายเงื่อนไขพร้อมกัน) ตัวแปลงของ Gradle จะตีความผลลัพธ์ตรงกับที่ Apache Maven ทำงานแบบร้อยเปอร์เซ็นต์หรือไม่ นี่คือจุดที่ทีม DevOps ควรทดสอบกับคอนฟิกจริงขององค์กรก่อนนำไปบังคับใช้ทั่วทั้งบริษัท - ตัวเลขอัตราเร่ง 45% บน Windows: ในเอกสารระบุชัดว่าเป็นตัวเลข “สูงสุดถึง 45%” (up to 45%) ในสถานการณ์ที่เครื่องมีปัญหา slow system clock อย่างแท้จริง นั่นแปลว่าหากคอมพิวเตอร์ของคุณเป็นเครื่อง Windows ที่ทำงานบนฮาร์ดแวร์ยุคใหม่ที่ไม่มีปัญหาเรื่อง latency ของการอ่านเวลา หรือเป็นเครื่องที่รันบน bare metal ทั่วไป คุณอาจจะไม่เห็นความแตกต่างของความเร็วสูงถึงระดับนั้น ตัวเลขนี้จึงไม่ใช่การการันตีว่าจะเร็วขึ้น 45% ในทุกเครื่อง ทุกโปรเจกต์
- กรอบเวลาของข่าวและการปล่อยตัวจริง: InfoQ ได้ลงรายงานข่าวสรุปความเคลื่อนไหวประจำสัปดาห์ตั้งแต่วันที่ 21 กันยายน 2026 เพื่อเกริ่นถึงการเตรียมพร้อมของเครื่องมือต่างๆ ในขณะที่ตัว Gradle 9.8.0 ได้รับการแท็กปล่อยอย่างเป็นทางการบน GitHub และเอกสารทางการในวันที่ 24 กันยายน 2026 การอ่านข่าวจากหลายแหล่งจึงต้องเข้าใจลำดับเวลาว่าเป็นการรายงานช่วงพรีวิวเตรียมการ ก่อนที่จะมาเป็นตัวเต็มให้ดาวน์โหลดจริงในสัปดาห์เดียวกัน
แล้วเราควรทำอะไร
จากข้อมูลทั้งหมด ผมขอสรุปแนวทางปฏิบัติที่ชัดเจนโดยแบ่งตามบทบาทหน้าที่ของแต่ละคนในทีมครับ:
ถ้าคุณเป็นนักพัฒนาซอฟต์แวร์ (Application Developer)
- อัปเกรด Gradle Wrapper ในโปรเจกต์ของคุณ: สั่งคำสั่ง
./gradlew :wrapper --gradle-version=9.8.0จากนั้นลองสั่งบิลด์และทดสอบว่างานเดิมยังคงผ่านปกติหรือไม่ - หากใช้ Windows ให้ลองสังเกตความเร็ว: สั่งรันคำสั่งบิลด์เดิมซ้ำสักสองสามรอบเพื่อดูว่าเวลาเฉลี่ยในการคอมไพล์ลดลงหรือไม่ โดยเฉพาะในโปรเจกต์ขนาดใหญ่ที่มีจำนวนไฟล์เยอะ
- อย่าเพิ่งรีบร้อนกระโดดไป Java 27 บนโปรดักชัน: แม้ Gradle จะรองรับแล้ว แต่ให้ตรวจสอบก่อนว่าเฟรมเวิร์กหลักที่คุณใช้ (เช่น Spring Boot, Micronaut, Quarkus) และปลั๊กอินตรวจสอบโค้ดอย่าง PMD หรือ SpotBugs มีเวอร์ชันที่รองรับ Java 27 อย่างเป็นทางการแล้วหรือยัง หากยังไม่มี ให้ใช้ Java 27 เฉพาะการทดลองเล่นฟีเจอร์ใหม่ในเครื่องส่วนตัวไปก่อน
ถ้าคุณเป็นทีม Platform Engineer หรือสถาปนิกดูแลระบบ (DevOps / Tech Lead)
- ทดสอบคุณสมบัติการยืม Mirror จาก Maven: ทดลองใส่
org.gradle.mirror.maven.settings=trueลงในไฟล์~/.gradle/gradle.propertiesในเครื่องทดสอบ แล้วตรวจดูว่า Gradle สามารถดึงแพ็กเกจผ่านเซิร์ฟเวอร์กระจกเงาของบริษัทตามที่ระบุไว้ใน~/.m2/settings.xmlได้ถูกต้องหรือไม่ - ปรับปรุงคู่มือ Onboarding ของทีม: หากผลการทดสอบผ่านไปด้วยดี คุณสามารถตัดขั้นตอนการติดตั้งสคริปต์
init.gradleที่ยุ่งยากออกจากเอกสารต้อนรับพนักงานใหม่ แล้วแนะนำให้เปิดใช้การแชร์ mirror settings ร่วมกับ Maven แทน - ตรวจสอบการใช้คำสั่ง
CopyและSyncในปลั๊กอินภายใน: หากทีมของคุณมีการพัฒนา Internal Gradle Plugin ใช้เอง ให้เริ่มวางแผนปรับเปลี่ยนโค้ดจากการใช้into(...)แบบเดิม มาเป็นdestinationDirectoryเพื่อเตรียมพร้อมรับมือกับมาตรฐาน Configuration Cache ในอนาคต
มุมมองของน้องกาย: ผมมองว่า การอัปเดตของ Gradle ในรอบ 9.8.0 นี้ ไม่ใช่เรื่องของการประโคมฟีเจอร์ใหม่หวือหวาที่มาเปลี่ยนโลกการเขียนโค้ด แต่คือการแก้ปัญหาความเจ็บปวดในชีวิตประจำวันของคนทำงานอย่างแท้จริง การยอมประนีประนอมเปิดทางให้แชร์คอนฟิกข้ามมาจากฝั่ง Maven แสดงให้เห็นถึงวุฒิภาวะของเครื่องมือที่เลิกตั้งแง่แข่งขันอย่างไร้เหตุผล และหันมารับฟังความลำบากของวิศวกรในสนามจริง เช่นเดียวกับการใส่ใจแก้ปัญหาคอขวดบน Windows ที่ช่วยลดความเหลื่อมล้ำระหว่างระบบปฏิบัติการลงไปได้มากครับ
Recap
- อัปเกรด Gradle Wrapper เป็นเวอร์ชัน 9.8.0 ด้วยคำสั่ง
./gradlew :wrapper --gradle-version=9.8.0 - ทดสอบรันชุดทดสอบเดิมเพื่อยืนยันว่าโปรเจกต์ทำงานได้ตามปกติและไม่มีการกระทบกระเทือน
- หากต้องการดึงการตั้งค่าคลังกระจกเงาจาก Maven ให้เพิ่ม
org.gradle.mirror.maven.settings=trueในgradle.properties - ตรวจสอบว่าคลังแพ็กเกจที่ต้องการแชร์ค่าเป็นประเภท Maven (HTTP/HTTPS) เท่านั้น ไม่รวมถึง Ivy, S3, GCS หรือ flatDir
- ทดสอบประสิทธิภาพการบิลด์บนระบบปฏิบัติการ Windows เพื่อดูผลลัพธ์จากการแก้ไขปัญหา slow system clock
- ตรวจสอบความเข้ากันได้ของปลั๊กอินภายนอก (เช่น PMD) ก่อนเปิดใช้งาน Java 27 ในระดับโปรดักชัน
- วางแผนปรับปรุงทาสก์ Copy และ Sync มาใช้
destinationDirectoryแบบ lazy เมื่อมีการปรับปรุงสคริปต์บิลด์