Neovim + Java LSP를 이용한 Play Framework sbt 프로젝트 — 누락된 가이드

발행: (2026년 3월 27일 오전 02:32 GMT+9)
6 분 소요
원문: Dev.to

It looks like only the source citation was provided. Could you please share the article text you’d like translated? Once I have the content, I’ll translate it into Korean while preserving the formatting, markdown, and code blocks as requested.

Source:

간단한 답변

sbt-eclipse는 Eclipse 프로젝트 파일을 생성하고, JDTLS(Eclipse의 Java 언어 서버)가 이를 사용합니다. 이것이 다리 역할을 하며, 나머지는 모두 설정 세부 사항에 불과합니다.

여기에 오셨다면, 이미 Metals를 시도해 보고 벽에 부딪힌 뒤 실망스러운 검색 결과를 보셨을 겁니다. 실제로 동작하는 설정은 다음과 같습니다.

프로젝트 상황

  • Play Framework 3.x, Java(Scala 아님)
  • sbt에 7개의 서브 모듈, 약 3 000개의 소스 파일
  • 무거운 코드 생성(OpenAPI, Avro, WSDL)
  • 팀은 IntelliJ를 사용하고, 당신은 Neovim을 사용

Metals는 sbt를 네이티브하게 이해하지만, Java 지원은 최소 수준에 머물러 있습니다(자동 완성, 호버, import 정리 기능이 없음). Metals 유지보수자는 다음과 같이 말했습니다:

“전체 Java 프로젝트에서 Metals를 사용하고 싶어 하는 경우를 상상할 수 없습니다.”

JDTLS는 완전한 Java 지원을 제공하지만 Maven, Gradle, Eclipse 프로젝트 형식만 이해하고 build.sbt는 알지 못합니다. 해결책은 sbt가 JDTLS가 기대하는 파일, 즉 .classpath.project를 생성하도록 하는 것입니다.

어려운 경험을 통해 배운 세 가지

함정이유
ThisBuild / 스코프를 사용하지 말 것sbt‑eclipseThisBuild가 아니라 프로젝트 레벨에서 키를 읽습니다. ThisBuild 아래에 배치된 설정은 조용히 무시됩니다.
ManagedSrc는 필수이것이 없으면 생성된 소스(Play 라우트, OpenAPI 코드 생성, Avro)가 .classpath에 나타나지 않습니다. ManagedClassesManagedResources만으로는 충분하지 않습니다.
preTasks := Seq(Compile / compile)코드 생성은 Eclipse 파일이 생성되기 에 실행되어야 합니다; 그렇지 않으면 관리되는 소스 디렉터리가 아직 디스크에 존재하지 않습니다.

sbt‑eclipse 설정

플러그인을 전역에 추가하기

// ~/.sbt/1.0/plugins/plugins.sbt
addSbtPlugin("com.github.sbt" % "sbt-eclipse" % "6.2.0")

플러그인 설정하기

// ~/.sbt/1.0/global.sbt
import com.typesafe.sbteclipse.core.EclipsePlugin.EclipseKeys

EclipseKeys.projectFlavor := EclipseProjectFlavor.Java
EclipseKeys.skipParents := false
EclipseKeys.withSource := true
EclipseKeys.preTasks := Seq(Compile / compile)
EclipseKeys.createSrc := EclipseCreateSrc.ValueSet(
  EclipseCreateSrc.Unmanaged,
  EclipseCreateSrc.Source,
  EclipseCreateSrc.Resource,
  EclipseCreateSrc.ManagedSrc,
  EclipseCreateSrc.ManagedClasses,
  EclipseCreateSrc.ManagedResources
)

Eclipse 파일 생성하기

sbt eclipse

이 명령은 먼저 프로젝트를 컴파일하여(코드 생성 트리거) .classpath.project 파일을 루트와 모든 서브모듈에 생성합니다.

생성된 파일을 .gitignore에 추가하기

.classpath
.project
.settings/

Mason을 통한 JDTLS 설치

:MasonInstall jdtls

Neovim용 루트 감지 설정

멀티‑모듈 sbt 프로젝트에서는 각 서브모듈이 자체 build.sbt.project를 가집니다. 이 중 하나라도 root_markers에 포함되면 JDTLS가 해당 서브모듈을 워크스페이스 루트로 간주하여 모듈 간 import가 깨집니다. 기본 기준으로 .git을 사용하세요:

vim.lsp.config("jdtls", {
  root_markers = {
    { "mvnw", "gradlew", "settings.gradle", "settings.gradle.kts", ".git" },
    { "pom.xml", "build.gradle", "build.gradle.kts", "build.xml" },
  },
})
vim.lsp.enable("jdtls")

Note: 중첩 배열은 Neovim 0.11.3+이 필요합니다. 첫 번째로 일치하는 그룹이 선택됩니다.

루트 감지를 변경했거나 모듈이 탐지되지 않을 경우 JDTLS 캐시를 삭제하세요:

rm -rf ~/.cache/nvim/jdtls/workspace/

그런 다음 Neovim을 재시작하면 JDTLS가 처음부터 모든 것을 다시 가져옵니다.

Neovim에서 완전한 Java IDE 기능

  • 코드 자동 완성
  • 정의로 이동 (모듈 간)
  • 참조 찾기
  • 진단
  • import 정리
  • 이름 바꾸기 리팩터링

Running/debugging Play는 여전히 터미널에서 sbt (sbt run)를 통해 수행됩니다. Play의 개발 모드가 표준 main 메서드를 사용하지 않기 때문입니다.

Classpath 업데이트build.sbt에서 의존성을 변경한 후 sbt eclipse를 다시 실행하고 JDTLS를 재시작합니다. 실제로는 한 달에 몇 번 정도만 발생합니다. 일반 코딩, 생성된 코드 변경, 그리고 동일한 의존성을 가진 브랜치 전환은 추가 작업이 필요하지 않습니다.

Sources and tools

  • sbt‑eclipse – 이를 가능하게 하는 브리지
  • nvim‑lspconfig – Neovim용 JDTLS 설정
  • Mason.nvim – LSP 서버 설치 프로그램
  • nvim‑metals#503 – Metals가 이 사용 사례에 작동하지 않음을 확인하는 토론
  • metals#1815 – Java‑전용 프로젝트 지원에 대한 Metals 팀의 입장
0 조회
Back to Blog

관련 글

더 보기 »

Neovim 0.12.0

text NVIM v0.12.0 빌드 유형: Release LuaJIT 2.1.1774638290 릴리즈 노트 - Changelog https://github.com/neovim/neovim/commit/fc7e5cf6c93fef08effc183087a2c8cc9bf...

Java 예외 처리 소개

예외 처리란 무엇인가? Java에서 예외 처리는 런타임 오류를 처리하여 프로그램의 정상 흐름을 유지할 수 있게 하는 메커니즘이다. An exc...

#22 Known는 Drop! for loop in Java

정의: 반복 횟수가 알려져 있을 때 일반적으로 코드 블록을 여러 번 반복하는 데 사용되는 제어문입니다. 구문: java for initializer; co...