메이븐(Maven) 프로젝트를 빌드하고 배포하는 스크립트를 만들다가 새로운 장비에서 메이븐 빌드를 수행하게 되었습니다. 메이븐 프로젝트를 빌드하다가 다음 에러를 만나게 되었습니다.
...
[ERROR] Plugin org.apache.maven.plugins:maven-clean-plugin:2.5 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.5: Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from/to central (https://repo.maven.apache.org/maven2): Received fatal alert: protocol_version -> [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/PluginResolutionException
...
프로토콜 버전이 맞지 않아서 'Central'에서 "maven-clean-plugin:jar:2.5"를 다운로드 할 수 없다는 의미의 에러 메시지입니다. 'Central'이라는 곳에서 clean 플러그인을 다운로드해야하는데 서버에 접속할 수 없어서 발생하는 문제로 보입니다. 우선 메이븐 'Central'이 뭔지 찾아보도록 하겠습니다.
Maven Central Repository?
메이븐(Maven)의 공식 문서에 가보면 'Central'에 대한 설명을 찾아 볼 수 있습니다. (링크 : introduction-to-repositories - 메이븐)
메이븐은 별도로 로컬 리파지토리를 pom.xml 파일에 명시하지 않는 이상 프로젝트에 필요한 의존성 라이브러리(Dependencies)들을 '메이븐 Central'이라는 곳에서 다운로드 합니다. 유명한 라이브러리들이 모여있는 중앙 저장소로 생각하면 편합니다.
메이븐은 2018년 6월 18일부터 보안 이슈가 있었던 TLS 1.0과 TLS 1.1 프로토콜을 사용하는 클라이언트의 접속을 허용하지 않고 있습니다. TLS 1.0 혹은 TLS 1.1 프로토콜을 사용하는 클라이언트는 더 이상 Central에서 플러그인들을 다운로드 할 수 없게 된 것입니다.
메이븐이 이런 결정을 하게된 계기는 Java 8부터는 TLSv1.2를 기본으로 사용하고 있기 때문입니다. 메이븐 측이 공개한 통계에 의하면 Java 6, Java 7을 사용하는 환경에서 Maven Central 저장소를 접근하는 경우는 전체 유저의 0.2% 가량밖에 안된다고 합니다.
이 포스트의 에러는 TLSv1.2 버전을 사용하지 않는 자바 버전인 Java 6, Java 7 환경에서 발생합니다.
문제 해결 방법
이 문제를 해결하기 위해서 취할 수 있는 액션에는 몇 가지가 있습니다.
1. Java 8 이상 사용하기
가장 좋은 방법은 최신 자바 버전으로 개발환경을 옮겨 오는 것입니다. 오래된 JDK 버전의 사용은 불가피한 경우가 아니면 피하는 것이 좋습니다.
2. Maven 실행 옵션으로 추가
어쩔 수 없이 Java 8 이전 버전을 사용해야한다면 Maven 설정에 TLSv1.2 프로토콜을 사용하도록 옵션을 명시하면 됩니다. 예를 들어 다음과 같이 메이븐을 실행하면 됩니다.
mvn -Dhttps.protocols=TLSv1.2 install
이렇게 옵션을 추가하면 Java 7에서도 TLSv1.2를 사용하게 되고 Maven Central로 문제없이 접근이 가능해집니다.
혹은 MAVEN_OPTS 환경 변수를 다음과 같이 설정해도 됩니다.
export MAVEN_OPTS=-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
그 밖에 Oracle Advanced Support를 이용해서 Java 7을 업그레이드하는 방법도 있다고 합니다. Java 6 이전 버전의 경우 TLSv1.2를 지원하는지 잘 모르겠네요. 이 경우에는 http를 통해 접근하도록 변경해야 합니다. (혹은 http://repo1.maven.org/maven2/ 도 어느정도는 유지된다고 하는데..그냥 모던 자바로 오세요.)
댓글