SpringBoot Gradle 기반의 프로젝트를 내 PC에서 빌드하고 실행해보기 위한 작업을 하던 중 문제가 발생했다.
💣 바로 빌드에 실패한 것!
위의 빌드 실패 과정 중에서 중요한 메세지는 아래와 같다.
* What went wrong:
Execution failed for task ':compileJava'.
> invalid source release: 11
오류 메세지의 내용은 빌드 과정에서 Java 파일을 컴파일하지 못했고, 그 이유는 Java 버전이 무언가 잘못 되었다는 것이다. 하지만 프로젝트를 IDE(Intellij)에서 빌드하고 실행할 때는 문제가 없었기 때문에 내 PC에 설정되어 있는 Java 버전과 다른 것이 원인인 것 같다는 추측을 했다.
빌드를 위한 세팅을 하는 build.gradle
파일에 Java 버전이 설정되어 있는지 확인한다.
// Java 소스를 컴파일할 때 사용할 Java 버전
sourceCompatibility = '11'
위의 설정이 되어 있지 않다면, 현재 사용 중인 Java 버전으로 기본 설정된다. Gradle docs 참고
결국, 프로젝트를 빌드 할 때 sourceCompatibility
로 설정된 버전으로 Java 소스를 컴파일 하게 되는데, 내 PC에서 사용하는 Java 버전이 '11'이 아니기 때문에 문제가 생긴 것이다.
만약 sourceCompatibility
설정을 없애고 빌드하면 현재 PC가 사용중인 Java 버전으로 컴파일 하면서 빌드에 성공할 것이다. (실제로 해본 결과 빌드에 성공했다😅) 하지만 개발 환경과 동일하게 설정하는 것이 좋을 것 같아 다른 방법을 찾아봤다.
빌드 자동화 도구로 gradle을 사용하는 프로젝트를 빌드할 때 gradle wrapper(gradlew)를 사용한다. 이때, gradle wrapper(gradlew)는 gradle 설치 없이 빌드를 실행하는 역할을 한다. Gradle docs 참고
gradlew을 열어보면 JAVA_HOME을 기준으로 JVM을 사용하게 되어있다. (shell script를 잘 모르지만, 주석을 통해 대충 짐작할 수 있었다)
cmd로 echo %Path% 를 실행해서 JAVA_HOME으로 설정된 Java의 버전을 확인한다.
확인 결과 JAVA_HOME이 Java 8로 설정되어 있었다. 과거에 설정해두고 잊어버리고 있었다!
따라서 PC의 시스템 환경 변수 JAVA_HOME으로 설정된 Java 버전과 프로젝트에 설정된 Java의 버전이 달라서 발생한 오류가 확실한 것을 알 수 있다.
❗ 두 가지 방법을 설명하기에 앞서, 두 번째 방법으로 해결하는 것을 추천한다.
내 PC의 시스템 환경 변수 JAVA_HOME을 Java 11 로 변경하면 완벽히 해결된다. 다음은 변경 후 제대로 설정되었는지 확인한 내용이다. 이때, 시스템 환경 변수 설정이 바로 적용되지 않을 수 있다. 혹시 설정을 했는데도 바뀌지 않았다면 PC를 다시 시작해 보면 변경된 버전을 확인할 수 있을 것이다.
변경된 설정을 확인한 후 프로젝트를 다시 빌드해서 확인해보자.
결과는 빌드 성공! 🥳
PC의 시스템 환경 변수 JAVA_HOME을 변경하지 않고 해결하는 방법도 있다.
빌드에 사용되는 JAVA_HOME 변수 정보를 gradle.propertise
파일에 정의하고 빌드 시에만 참조하도록 설정한다. gradle.propertise
파일은 프로젝트의 바로 아래 경로에 생성한다.
파일 생성 후 아래와 같이 org.gradle.java.home
설정을 하면 빌드 시 사용하는 JAVA_HOME 을 특정 경로의 Java로 지정할 수 있다. Gradle docs 참고
org.gradle.java.home=Java 설치 경로
org.gradle.java.home=C:\\DevTools\\Java\\Java11\\jdk-11.0.16.1
시스템 환경 변수를 다시 다른 버전으로 바꾸고 일부러 오류를 만든 다음 gradle.propertise
파일을 생성하고 빌드해본 결과, 성공! 🥳
cf. .gitignore
에 gradle.properties
파일을 추가하면 개발자별로 다르게 설정할 수 있다.
cf. org.gradle.java.home
설정할 때, 경로에 \
를 두 번 적어야 한다.