본문 바로가기

Build Tools/Maven

[ Maven ] MAVEN 컴파일 자바 버전 설정

[ Maven ] MAVEN 설치 참조

 

1. 기본 테스트 환경 구성

# docker run --rm -it fedora:40 /bin/bash

# 3.8 : java 1.7 ~ 11 지원
# 3.9.9 : java 1.8 ~ 21 지원
mkdir -p /app/install /app/dkit/maven/3.8.7 /app/dkit/maven/3.9.9 /app/dkit/jdk/23

curl -L https://download.java.net/openjdk/jdk23/ri/openjdk-23+37_linux-x64_bin.tar.gz -o /app/install/openjdk-23-linux-x64_bin.tar.gz

curl -L https://archive.apache.org/dist/maven/maven-3/3.8.7/binaries/apache-maven-3.8.7-bin.tar.gz -o /app/install/maven-3.8.7.tar.gz

curl -L https://archive.apache.org/dist/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz -o /app/install/maven-3.9.9.tar.gz

# -- java 23 설치
tar xvfz /app/install/openjdk-23-linux-x64_bin.tar.gz -C /app/dkit/jdk/23 --strip-components=1

ln -Tfs /app/dkit/jdk/23 /app/dkit/jdk/release

ln -Tfs /app/dkit/jdk/release/bin/java /usr/bin/java

# 버전 확인
java -version

# maven 3.8 설치
tar xvfz /app/install/maven-3.8.7.tar.gz -C /app/dkit/maven/3.8.7 --strip-components=1

# maven 3.9 설치
tar xvfz /app/install/maven-3.9.9.tar.gz -C /app/dkit/maven/3.9.9 --strip-components=1

# 3.8.7 사용 자바 버전 확인
/app/dkit/maven/3.8.7/bin/mvn -version

# 3.9.9 사용 자바 버전 확인
/app/dkit/maven/3.9.9/bin/mvn -version

 

2. 기본 자바 컴파일 버전 확인

mkdir -p /app/ws

rm -rf /app/ws/test; cd /app/ws

# 메이븐 프로젝트 기본 구조 생성
/app/dkit/maven/3.8.7/bin/mvn archetype:generate -DgroupId=com.example -DartifactId=test -DinteractiveMode=false -DoutputDirectory=/app/ws

# 에러 발생을 확인
cd /app/ws/test; /app/dkit/maven/3.8.7/bin/mvn install

# maven compiler 버전 3.1 확인
/app/dkit/maven/3.8.7/bin/mvn help:effective-pom | grep -A 1 maven-compiler

 

maven 3.8.7 버전 [ maven install ] 명령어 실행시 아래의 에러 메시지가 발생한다.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.783 s
[INFO] Finished at: 2024-10-31T03:23:09Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project test: Compilation failure: Compilation failure:
[ERROR] Source option 5 is no longer supported. Use 8 or later.
[ERROR] Target option 5 is no longer supported. Use 8 or later.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
rm -rf /app/ws/test; cd /app/ws

# 메이븐 프로젝트 기본 구조 생성
/app/dkit/maven/3.9.9/bin/mvn archetype:generate -DgroupId=com.example -DartifactId=test -DinteractiveMode=false -DoutputDirectory=/app/ws

# 빌드가 성공적으로 이루어 지는 것을 확인
cd /app/ws/test; /app/dkit/maven/3.9.9/bin/mvn install

# maven compiler 버전 3.13.0 확인
/app/dkit/maven/3.9.9/bin/mvn help:effective-pom | grep -A 1 maven-compiler

# 빌드된 자바 소스 파일 버전 확인
# major version: 52 
/app/dkit/jdk/release/bin/javap -v /app/ws/test/target/classes/com/example/App.class | grep major
[INFO] --- compiler:3.13.0:testCompile (default-testCompile) @ test ---
[INFO] Recompiling the module because of changed dependency.
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file with javac [debug target 1.8] to target/test-classes
[WARNING] bootstrap class path is not set in conjunction with -source 8
  not setting the bootstrap class path may lead to class files that cannot run on JDK 8
    --release 8 is recommended instead of -source 8 -target 1.8 because it sets the bootstrap class path automatically
[WARNING] source value 8 is obsolete and will be removed in a future release
[WARNING] target value 8 is obsolete and will be removed in a future release
[WARNING] To suppress warnings about obsolete options, use -Xlint:-options.
[INFO]
[INFO] --- surefire:3.2.5:test (default-test) @ test ---
[INFO] Using auto detected provider org.apache.maven.surefire.junit.JUnit3Provider
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.042 s -- in com.example.AppTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- jar:3.4.1:jar (default-jar) @ test ---
[INFO] Building jar: /app/ws/test/target/test-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- install:3.1.2:install (default-install) @ test ---
[INFO] Installing /app/ws/test/pom.xml to /root/.m2/repository/com/example/test/1.0-SNAPSHOT/test-1.0-SNAPSHOT.pom
[INFO] Installing /app/ws/test/target/test-1.0-SNAPSHOT.jar to /root/.m2/repository/com/example/test/1.0-SNAPSHOT/test-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.993 s
[INFO] Finished at: 2024-10-31T05:01:38Z
[INFO] ------------------------------------------------------------------------


maven 3.9.9 버전 [ maven install ] 명령어 실행시 빌드가 성공하는 것을 확인 할 수 있다.

이 와 같은 원인은 maven 버전 별 디폴트로 사용하는 maven-compiler-plugin 버전이 다르기 때문이다.

로그 및 명령어를 통해 확인해보면 3.8.7 버전은 기본적으로 사용하는 maven-compiler-plugin 버전이 3.1이고
3.9.9은 3.13.0 버전을 사용하는 것이 확인가능하다.

여기서 plugin 별 기본적으로 컴파일되는 자바 버전은 다음과 같다.

Maven Compiler Plugin 버전
Default Java Source/Target Version
3.0 - 3.2 1.5
3.3 1.6
3.5 - 3.6.1 1.7
3.6.2 - 3.7.0 1.8
3.8.0 - 3.8.1 1.8
3.8.2 11
3.10.0 - 3.10.1 11
3.11.0 11
3.12.0 17
3.13.0 17

여기서 3.1.0 버전은 1.5를 사용하는데 메이븐에서 자바 9 이상으로 빌드할때 더이상 5버전 빌드가 지원되지 않기 때문에

에러가 발생을한다.

또한 maven 3.9.9 버전 사용시는 컴파일러 버전이 디폴트로 3.13.0로 사용되기 때문에 5버전보다 높은 자바 버전으로 컴파일되어
에러가 발생하지 않는다.
※ 위 표에서는 3.13.0이 경우 17로 빌드된다고 나와있지만 실제 컴파일 해보니 1.8 버전에 해당하는 버전인 52 버전으로

   표시되었습니다. 해당 증상에대해 알고계시는 분은 댓글 바랍니다.

Major Version Java Version
45 Java 1.1
46 Java 1.2
47 Java 1.3
48 Java 1.4
49 Java 5
50 Java 6
51 Java 7
52 Java 8
53 Java 9
54 Java 10
55 Java 11
56 Java 12
57 Java 13
58 Java 14
59 Java 15
60 Java 16
61 Java 17
62 Java 18
63 Java 19
64 Java 20
65 Java 21
66 Java 22
67 Java 23

 

3. MAVEN 컴파일 자바 버전 설정
메이븐 프로젝트가 빌드될때 에러가 발생하지않고 동일한 자바 버전으로 컴파일 되기 위해서는 적절한 pom.xml

설정을 작성해야 한다.

mkdir -p /app/ws

rm -rf /app/ws/test; cd /app/ws

# 메이븐 프로젝트 기본 구조 생성
/app/dkit/maven/3.8.7/bin/mvn archetype:generate -DgroupId=com.example -DartifactId=test -DinteractiveMode=false -DoutputDirectory=/app/ws

cat <<'EOF' > /app/ws/test/pom.xml
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>test</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>test</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>17</source>
          <target>17</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
EOF

# 프로젝트 빌드
cd /app/ws/test; /app/dkit/maven/3.8.7/bin/mvn install

# maven compiler 버전 3.8.1 확인
/app/dkit/maven/3.8.7/bin/mvn help:effective-pom | grep -A 1 maven-compiler

# 빌드된 자바 소스 파일 버전 확인
# major version: 61
/app/dkit/jdk/release/bin/javap -v /app/ws/test/target/classes/com/example/App.class | grep major

'Build Tools > Maven' 카테고리의 다른 글

[ Maven ] MVNW 프로젝트 적용  (2) 2024.10.31
[ Maven ] MAVEN 전역 변수 설정  (0) 2024.10.31
[ Maven ] MAVEN 설치  (0) 2023.01.23