Neovim + Java LSP를 이용한 Play Framework sbt 프로젝트 — 누락된 가이드
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‑eclipse는 ThisBuild가 아니라 프로젝트 레벨에서 키를 읽습니다. ThisBuild 아래에 배치된 설정은 조용히 무시됩니다. |
ManagedSrc는 필수 | 이것이 없으면 생성된 소스(Play 라우트, OpenAPI 코드 생성, Avro)가 .classpath에 나타나지 않습니다. ManagedClasses와 ManagedResources만으로는 충분하지 않습니다. |
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 jdtlsNeovim용 루트 감지 설정
멀티‑모듈 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 팀의 입장