오랜만에 예전에 하던 프로젝트를 새 노트북에 풀 받아 작업을 해봤는데 빌드와 테스트가 되지 않는 문제가 생겼다. 역시 프로젝트 절반은 세팅이라 그런지, 새로운 디바이스로 오랜만에 해보려니 마치 세팅도 처음부터 하는 기분이었다..
문제 상황
나는 IntelliJ IDE를 사용하고 있다. IntelliJ에서 Gradle을 사용한 애플리케이션을 실행시키거나 빌드, 테스트를 할 때 사용할 툴을 IntelliJ IDEA와 Gradle 중 선택할 수 있다. 해당 설정은 `File` → `Settings` → `Build, Execution, Deployment` → `Build Tools` → `Gradle`에서 할 수 있다.
IntelliJ IDEA는 IDE용 최적화가 되어 실행 속도가 빠를 순 있지만, 모든 설정이 Gradle을 따라가는 것이 아니다. 사소한 문제가 생길 수 있기 때문에 Gradle이 기본 옵션이기에 나도 크게 신경쓰지 않고 Gradle 모드로 항상 개발을 진행해왔다.
사소한 설정을 마무리하고 테스트를 돌리려니, 다음과 같은 예외가 발생하며 실패했다.
`GradleWorkerMain`을 못 찾아서 아예 실행을 못했다. 테스트 실행 툴을 위의 세팅화면 하단에 보면 프로젝트에서 동작하는 Gradle에 대한 설정을 정할 수도 있다. Distribution은 프로젝트 내의 Wrapper로 설정되어 있고, Gradle JVM은 프로젝트 환경과 같은 Java 17로 설정되어 있어 문제 없는 듯 보였다.
심지어 `./gradlew clean test`를 입력해 CLI로 gradle wrapper를 실행시키면 문제없이 됐다. 그렇다고 매번 CLI로 할 수도 없고, IntelliJ를 사용하면서 테스트 지원도 못 받는다니..
시도
무엇이 문제일까 열심히 뒤져보고 생각해보던 중, Windows OS의 컴퓨터 사용자 이름이 한글로 지정되어 프로젝트 경로 중간에 한글이 들어갔다는 사실이 의심됐다. 사용자를 새로 만들어 그 쪽으로 프로젝트를 옮기는 것도 방법이었지만, 사용자를 맘대로 만들거나 하기 힘든 상황이었다. 그래서 프로젝트를 C 드라이브 하위로 옮겨 프로젝트 경로 상 한글을 피했다.
하지만 상황은 변하지 않았다.
추측
다시 처음부터 돌아가 생각해봤다. `GradleWorkerMain`이라는 클래스 조차 못 찾았다니, Gradle Wrapper가 설정 스크립트대로 돌아가려고 시도했으나 Gradle을 찾지 못해 실패한 것이 아닐까 하는 생각이 들었다. 즉, gradle distribution이 저장되는 경로가 의심이 갔다.
왜냐하면 Gradle user home의 경로에도 한글이 포함되었기 때문이다. `C:\Users\<사용자>`디렉토리 하위를 확인해보니 `.gradle`이 있었다. gradle distribution이 저장되는 경로에 대한 확신이 들기 시작했다.
정확한 원인
결론적으로 원인은 Gradle Wrapper의 distribution이 실제로 풀리는 경로인 `GRADLE_USER_HOME`이었다.
Gradle은 컴퓨터에 실제로 설치되어 있지 않더라도, Wrapper script를 통해 distribution을 다운받아 사용할 수 있었다. 이 script는 프로젝트 생성 시 항상 있던 `gradlew`와 `gradlew.bat`이다. 그렇게 다운 받은 distribution이 저장되는 경로가 `distributionBase`이다.
기본적인 Gradle Wrapper의 `distributionBase`는 `GRADLE_USER_HOME`환경변수에 따르는 것을 `gradle-wrapper.properties`에서 확인할 수 있다.
`GRADLE_USER_HOME`이 환경변수에 없으면 기본값이 `~/.gradle`, 혹은 `C:\Users\<USERNAME>\.gradle`이다.
gradle distribution이 예상대로 한글 폴더가 포함된 경로에 저장되었고, 이것을 IntelliJ로 사용하려니 문제였다. Gradle 자체만을 실행하면 문제가 되지 않지만, IntelliJ는 영어가 아닌 디렉토리가 경로에 포함되는 것에 민감하기 때문이었다. IntelliJ에서 Gradle을 실행시키기 위해 해당 distribution을 찾았으나 한글 경로를 읽지 못해 `GradleWorkerMain`을 못 찾았던 것이다.
해결
경로에 한글을 포함시키지 않는 것이 가장 깔끔한 해결방안이다. 하지만 나처럼 그러기 힘든 상황이라면 `distributionBase`에 한글이 포함되지 않게 하거나, IntelliJ의 설정에서 `Gradle user home`을 변경해주어야 한다.
직접 `gradle-wrapper.properties`의 값을 변경해도 되지만, 시스템 환경변수에 `GRADLE_USER_HOME`을 한글이 포함되지 않은 `C:\.gradle`로 추가해주어 해결했다.