Tech Blog

ปัญหาและวิธีแก้ไขเมื่อพัฒนา Java ด้วย VS Code + GitHub Copilot

by Tech Writer
VS Code GitHub Copilot Java Spring Boot

บทนำ

เมื่อพัฒนา 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 ไหลเข้า jshellExit 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 ก่อนเป็นเส้นทางที่เร็วที่สุดสู่การแก้ปัญหา

ส่งข้อความได้ตามสบาย

กรุณาส่งข้อความ หากมีคำปรึกษาด้านเทคนิค ความคิดเห็น หรือคำถาม