[Spring Boot / Gradle] 빌드 시 Execution failed for task ':compileJava'. > invalid source release: 11 오류 해결

isohyeon·2022년 10월 12일
1
post-custom-banner

문제 상황

SpringBoot Gradle 기반의 프로젝트를 내 PC에서 빌드하고 실행해보기 위한 작업을 하던 중 문제가 발생했다.

💣 바로 빌드에 실패한 것!

위의 빌드 실패 과정 중에서 중요한 메세지는 아래와 같다.

* What went wrong:
Execution failed for task ':compileJava'.
> invalid source release: 11

원인 추론

오류 메세지의 내용은 빌드 과정에서 Java 파일을 컴파일하지 못했고, 그 이유는 Java 버전이 무언가 잘못 되었다는 것이다. 하지만 프로젝트를 IDE(Intellij)에서 빌드하고 실행할 때는 문제가 없었기 때문에 내 PC에 설정되어 있는 Java 버전과 다른 것이 원인인 것 같다는 추측을 했다.

💡 프로젝트의 Java 버전 확인

빌드를 위한 세팅을 하는 build.gradle 파일에 Java 버전이 설정되어 있는지 확인한다.

// Java 소스를 컴파일할 때 사용할 Java 버전
sourceCompatibility = '11'

위의 설정이 되어 있지 않다면, 현재 사용 중인 Java 버전으로 기본 설정된다. Gradle docs 참고

결국, 프로젝트를 빌드 할 때 sourceCompatibility 로 설정된 버전으로 Java 소스를 컴파일 하게 되는데, 내 PC에서 사용하는 Java 버전이 '11'이 아니기 때문에 문제가 생긴 것이다.

만약 sourceCompatibility 설정을 없애고 빌드하면 현재 PC가 사용중인 Java 버전으로 컴파일 하면서 빌드에 성공할 것이다. (실제로 해본 결과 빌드에 성공했다😅) 하지만 개발 환경과 동일하게 설정하는 것이 좋을 것 같아 다른 방법을 찾아봤다.

💡 gradle wrapper(gradlew)의 JAVA_HOME

빌드 자동화 도구로 gradle을 사용하는 프로젝트를 빌드할 때 gradle wrapper(gradlew)를 사용한다. 이때, gradle wrapper(gradlew)는 gradle 설치 없이 빌드를 실행하는 역할을 한다. Gradle docs 참고

gradlew을 열어보면 JAVA_HOME을 기준으로 JVM을 사용하게 되어있다. (shell script를 잘 모르지만, 주석을 통해 대충 짐작할 수 있었다)

💡 내 PC의 JAVA_HOME 설정 확인

cmd로 echo %Path% 를 실행해서 JAVA_HOME으로 설정된 Java의 버전을 확인한다.

확인 결과 JAVA_HOME이 Java 8로 설정되어 있었다. 과거에 설정해두고 잊어버리고 있었다!

따라서 PC의 시스템 환경 변수 JAVA_HOME으로 설정된 Java 버전과 프로젝트에 설정된 Java의 버전이 달라서 발생한 오류가 확실한 것을 알 수 있다.

해결 방법

❗ 두 가지 방법을 설명하기에 앞서, 두 번째 방법으로 해결하는 것을 추천한다.

방법1. 시스템 환경 변수 JAVA_HOME 설정 변경

내 PC의 시스템 환경 변수 JAVA_HOME을 Java 11 로 변경하면 완벽히 해결된다. 다음은 변경 후 제대로 설정되었는지 확인한 내용이다. 이때, 시스템 환경 변수 설정이 바로 적용되지 않을 수 있다. 혹시 설정을 했는데도 바뀌지 않았다면 PC를 다시 시작해 보면 변경된 버전을 확인할 수 있을 것이다.

변경된 설정을 확인한 후 프로젝트를 다시 빌드해서 확인해보자.
결과는 빌드 성공! 🥳

방법2. Gradle의 JAVA_HOME 지정

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. .gitignoregradle.properties 파일을 추가하면 개발자별로 다르게 설정할 수 있다.
cf. org.gradle.java.home 설정할 때, 경로에 \를 두 번 적어야 한다.

'방법2'를 추천하는 이유

  • 개발하는 프로젝트가 여러 개일 경우 프로젝트마다 사용하는 Java의 버전이 다를 수 있다. 이때, 프로젝트를 빌드할 때마다 시스템 환경 변수를 변경하는 것은 너무 번거롭다.
  • 학습용이 아니라 실제 배포하고 운영하기 위한 프로젝트라면 배포한 환경의 JAVA_HOME을 함부로 변경하는 것은 위험하다. (어떤 다른 프로젝트가 사용하고 있을지 모르기 때문!) 따라서, 프로젝트가 사용할 Java를 설치하고 Gradle이 바라보는 JAVA_HOME을 해당 경로로 지정해주는 것이 안전하다.

Reference

profile
junior developer (●'◡'●)
post-custom-banner

0개의 댓글