ปัญหาและวิธีแก้ไขเมื่อพัฒนา Java ด้วย VS Code + GitHub Copilot
บทนำ
เมื่อพัฒนา Java ใน VS Code extensions หลายตัวทำงานพร้อมกัน
ซึ่งอาจทำให้เกิดการรบกวนและความขัดแย้งที่ไม่คาดคิด
การผสมผสานเหล่านี้โดยเฉพาะต้องการความระมัดระวัง:
- Language Support for Java (โดย Red Hat)
- GitHub Copilot / GitHub Copilot Chat
- Spring Boot Extension Pack
- Maven Wrapper + project-internal Node configuration
บทความนี้คือบันทึกของปัญหาที่พบจริงและวิธีแก้ไข
① ปัญหา: run_in_terminal ถูก jshell ดูดไป
อาการ
เมื่อพยายาม run commands ใน VS Code terminal
input ไหลเข้า jshell (Java’s REPL) session ที่กำลังรันอยู่โดยผิดพลาด
สาเหตุ
Language Support for Java extension บางครั้งเปิด jshell session เมื่อ startup
ซึ่ง conflict กับ active terminal
วิธีแก้ไข
Run commands ผ่าน VS Code Tasks (tasks.json)
// .vscode/tasks.json
{
"tasks": [
{
"label": "build-skip-tests",
"type": "shell",
"command": ".\\mvnw.cmd",
"args": ["-DskipTests", "package"],
"options": {
"cwd": "${workspaceFolder}"
}
}
]
}
Tasks รันใน shell อิสระ จึงไม่ได้รับผลกระทบจาก jshell
② Java Language Server ดึง JDK เก่ามาใช้
อาการ
ระบุ Java 21 ใน pom.xml แต่
code errors แสดงตาม Java 11 rules
สาเหตุ
JDK ที่ VS Code’s Java Language Server ใช้ และ
compilation target ของ project ไม่ตรงกัน
วิธีตรวจสอบ
Command Palette (Ctrl+Shift+P) → Java: Configure Java Runtime
↓
ตรวจสอบว่า “Project JDK” แสดง version ที่ถูกต้องหรือไม่
วิธีแก้ไข
ระบุ JDK อย่างชัดเจนใน .vscode/settings.json
// .vscode/settings.json
{
"java.configuration.runtimes": [
{
"name": "JavaSE-21",
"path": "C:\\Program Files\\Java\\jdk-21",
"default": true
},
{
"name": "JavaSE-25",
"path": "C:\\Program Files\\Java\\jdk-25"
}
],
"java.jdt.ls.java.home": "C:\\Program Files\\Java\\jdk-21"
}
③ Copilot Chat’s Agent Mode ยึด Terminal
อาการ
เมื่อ Copilot Agent execute commands
input อาจถูกส่งไปยัง terminal session ที่เปิดอยู่แล้ว
ถ้า jshell กำลังรัน mvn commands จะถูก interpret เป็น jshell input
วิธีแก้ไข
- ถ้า jshell กำลังรันใน terminal ให้ exit ด้วย
:exit - เมื่อขอให้ Copilot Agent execute commands
ให้เปิด terminal ใหม่ก่อน request หรือขอให้รันผ่าน task
④ การตั้งค่า Annotation Processor เมื่อใช้ Lombok
อาการ
Lombok annotations เช่น @Getter, @Builder แสดง red underlines
Compilation ผ่านแต่ error display ไม่หายไป
วิธีแก้ไข
// .vscode/settings.json
{
"java.compile.nullAnalysis.mode": "disabled",
"java.configuration.updateBuildConfiguration": "automatic"
}
ยังต้องตรวจสอบว่า Lombok dependency ถูกเพิ่มใน pom.xml อย่างถูกต้อง:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
⑤ Spring Boot DevTools + Copilot Auto-Complete Conflicts
อาการ
Hot reload โดย Spring Boot DevTools รันบ่อย
และ Copilot’s completions ถูก reset กลางคัน
วิธีรับมือ
ระหว่าง development ให้ DevTools ทำงานต่อ
แต่หยุด app ชั่วคราวเมื่อทำ large completions (class generation ฯลฯ)
การจำกัด restart triggers ของ DevTools ก็ได้ผล:
# application-local.yml
spring:
devtools:
restart:
additional-exclude: "**/*.html,**/*.css,**/*.js"
⑥ Java Language Server Conflicts ใน Multi-Root Workspaces
อาการ
เมื่อเปิด Spring Boot projects หลายตัว (admin / customer-app) ใน VS Code window เดียวกัน
Language Server บางครั้งไม่จดจำแต่ละ project แยกกัน
ทำให้ classes จาก project หนึ่งไม่สามารถมองเห็นได้
สาเหตุ
Java Language Server อาจใช้เวลานานในการจดจำแต่ละ project
วิธีแก้ไข
กำหนด multi-root workspace โดยใช้ .code-workspace file
// dvd-rental.code-workspace
{
"folders": [
{
"name": "admin",
"path": "C:\\Users\\y_104\\git\\dvd-rental-admin"
},
{
"name": "customer-app",
"path": "C:\\Users\\y_104\\git\\dvd-rental-customer-app"
}
],
"settings": {
"java.import.maven.enabled": true
}
}
สรุป
| ปัญหา | วิธีแก้ไข |
|---|---|
| Terminal ถูก jshell ดูดไป | Run commands ผ่าน tasks.json tasks |
| Language Server ใช้ JDK เก่า | ระบุ JDK อย่างชัดเจนใน .vscode/settings.json |
| Copilot terminal execution ไหลเข้า jshell | Exit jshell ด้วย :exit ก่อน request |
| Lombok red underlines ไม่หาย | nullAnalysis.mode: disabled |
| Project recognition issue ใน multi-root | กำหนดอย่างชัดเจนด้วย .code-workspace file |
การพัฒนา Java ใน VS Code ได้ประโยชน์จาก extensions ที่หลากหลาย
แต่การรบกวนจาก extensions หลายตัวที่แตะ resources เดียวกันเกิดขึ้นบ่อย
เมื่อมีบางอย่าง “ทำงานไม่ถูกต้อง” การตรวจสอบ Language Server status และ active terminals ก่อนเป็นเส้นทางที่เร็วที่สุดสู่การแก้ปัญหา