빌드 시 JAVA_HOME 변경하지 않고 JDK 버전 변경하기

토이 프로젝트를 진행 중인데 이때 아니면 언제 써보겠나 해서 java 11 버전을 사용하고 있다.
(제대로 Java 11의 기능을 못쓰는게 문제지만…)

개발하고, 테스트코드 짜고, 로컬에서 돌려서 수동 테스트하고…
프로젝트가 어느정도 진행이 되서 빌드를 하려고 했는데 BUILD FAILURE가 뜨는 것이었다…

처음엔 IntelliJ에서 JDK 설정이 문제인가 해서 봤는데 문제가 없었고 기존에 IDE를 통해서 잘 개발해왔기 때문에 이 부분은 문제가 아니라고 판단하였다.

구글링도 해보고 여러 삽질도 해보고한 결과
문제의 원인은 지금 사용하고 있는 랩탑에 JDK가 여러개 깔려있는데 JAVA_HOME이 1.8 버전으로 설정되어 있기 때문이다.
그래서 11 버전 애플리케이션 빌드 시에도 Maven이 1.8 버전을 JDK로 사용해서 오류가 난 것이었다.

이 문제를 해결하려면 JAVA_HOME을 변경하거나 빌드 툴이 사용하는 JDK 버전과 경로를 지정해주면된다.

이 포스팅에서는 Spring Initializr를 통해 Java 11로 프로젝트를 생성한 뒤 JDK 버전과 경로를 설정하는 방법에 대해 설명할 것이다.

Gradle 프로젝트

프로젝트 디렉토리에 gradle.properties 파일을 생성하여
org.gradle.java.home 설정을 통해 Gradle의 JAVA_HOME을 설정할 수 있다.

1
org.gradle.java.home=C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.3.7-hotspot

설정 후 ./gradlew build를 실행하면 이상 없이 빌드되는 것을 확인할 수 있을 것이다.
ignore에 gradle.properties를 추가하면 개발자별로 다르게 설정도 가능할 것이다.

  • 설정 전
  • 설정 후

Maven 프로젝트

Apache Maven 웹사이트에 있는 예제를 따라 pom.xml에 Maven compiler plugin 설정을 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>

<properties>
<!-- Java 버전을 지정한다. -->
<java.version>11</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

<!-- maven-compiler-plugin 설정 추가 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<fork>true</fork>
<!-- 사용하고자 하는 JDK의 javac 경로를 지정해준다. -->
<executable>C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.3.7-hotspot\\bin\\javac</executable>
<compilerVersion>${java.version}</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>

</project>

여기까지 설정을 하고 ./mvnw package를 실행하면 아래 로그 같이 Test 실패로 인한 BUILD FAILURE가 뜰 것이다.
(SurefireBooterForkException가 뜨는걸 보니 maven-compiler-plugin의 fork 설정과 관련이 있는 것 같다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.226 s
[INFO] Finished at: 2019-07-12T09:29:41+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project demo: There are test failures.
[ERROR]
[ERROR] Please refer to D:\mine\demosfsaf\target\surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] There was an error in the forked process
[ERROR] com/example/demo/DemoApplicationTests has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime onl
y recognizes class file versions up to 52.0
[ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: There was an error in the forked process
[ERROR] com/example/demo/DemoApplicationTests has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime onl
y recognizes class file versions up to 52.0

이 문제에 대해 구글링을 한 결과 stack overflow에서 Maven Surefire plugin을 추가해줘야 한다고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<fork>true</fork>
<executable>C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.3.7-hotspot\\bin\\javac</executable>
<compilerVersion>${java.version}</compilerVersion>
</configuration>
</plugin>

<!-- maven-surefire-plugin 추가 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<!-- 사용하고자 하는 JDK의 java 경로 -->
<configuration>
<jvm>C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.3.7-hotspot\\bin\\java</jvm>
</configuration>
</plugin>
</plugins>

2019년 7월 12일 기준으로 2.19.1 버전이 가장 많이 사용되고 있어서 해당 버전으로 사용하였다.

configuration의 jvm 설정의 경우 Spring Initializr를 통해 생성된 프로젝트는
처음에 테스트 코드가 비어있는 상태여서 jvm 설정을 하지 않아도 문제가 나지 않지만,
테스트 코드가 있는 경우 빌드 전 테스트 시에 아래와 같이 문제가 날 수 있기 때문에 추가한 설정이다.

1
2
3
4
5
6
7
8
9
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25.673 s
[INFO] Finished at: 2019-07-12T11:37:53+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test (default-test) on project mayu: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test failed: There was an error in the forked process
[ERROR] java.lang.UnsupportedClassVersionError: io/github/ivvve/domains/leader/acceptance/LeaderRegistrationTest has been compiled by a more recent version of the Java Runtime
(class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

모든 설정 후 ./mvnw package를 실행하면 이상 없이 빌드되는 것을 확인할 수 있을 것이다.
(Gradle에 비해 문제 해결 방법을 찾는데 꽤 수고가 들었다…)

  • 설정 전
  • 설정 후

참고

Share