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 |