Maven 3.0 정식버전이 출시됐다. (http://maven.apache.org/docs/3.0/release-notes.html)

Maven 3.0은 2.x와의 호환성을 최대한 유지하면서 성능을 대폭 개선했고 안정성을 높였다고 한다. 이클립스에서 m2eclipse 플러그인을 사용하고 있다면 이미 Maven 3.0 엔진을 사용하고 있는 셈이다. m2e 플러그인 설정에서 별도로 설치된 2.x버전을 선택했다고 하더라도 프로젝트에 직접 맞물려서 돌아가는 의존 라이브러리 관리 기능은 내장형 3.0 엔진으로 동작한다.

Maven 2.x로 작업하면서 하도 고생을 많이 해서 한동안 ANT/Ivy로 넘어갈까도 생각했지만, m2eclipse라는 화려한 이클립스 플러그인의 지원과 Sonatype을 중심으로 한 Maven 개발자들의 열정 때문에 그대로 Maven으로 남기로 했다. 사실 ANT/Ivy로 깔끔한 빌드 체계를 만드는 것은 결코 쉬운 일도 아니기도 하고. 또, Maven의 많은 단점이 3.0에서 대폭 개선될 것이라는 기대도 한몫했을 것이다.

최근에 시작한 프로젝트에 Maven 3.0을 적용하고 있는데 여러모로 맘에 든다. 확실히 경고 메시지가 이전보다 꼼꼼하고 상세하게 나와서 POM 작성에 도움이 된다. 성능은 멀티 모듈을 쓰지 않으니 잘 모르겠고.

사실 가장 맘에 드는 것은 예전에 나를 괴롭혔던 Maven 버전 체계다. 특히 OSGi 버전 포맷과의 충돌 때문에 스프링소스 리포지토리의 번들을 사용할 때 짜증났던 점들이 모두 개선됐다.

Maven 2.x대의 버전 문제에 대해서는 예전에 기록해둔 글이 두 개 있다.

Maven의 버전 포맷과 이를 해석하는 방법을 정확하게 이해하지 않으면 버전 범위를 적용하거나 버전 충돌이 있는 경우에 까다로운 문제가 발생할 수 있다.

Maven의 기본 버전 포맷은 a.b.c-d 구조로 되어있다. a, b, c는 각각 숫자로 된 버전 번호고 d는 추가 식별자이다. 1.0.0-M1 이라고 하면 각각 1, 0, 0, M1으로 해석된다. 문제는 기존 Maven은 정확히 이 포맷을 따르지 않으면 버전 전체를 식별자 취급을 해버린다는 점이다. 그래서 OSGi 버전 포맷을 따르는 스프링 번들이 3.0.0.RELEASE고 되어있으면 3, 0, 0, RELEASE로 해석되는 대신 0, 0, 0, 3.0.0.RELASE라고 해석되버린다. OSGi 버전포맷은 -대신 .을 사용하기 때문이다. 그래서 3.0.0.RELEASE는 1.0.0보다도 더 낮은 버전이 되버리는 문제가 발생한다.

Maven 2.x에서 스프링 3.0.x 대의 가장 최신 버전을 자동 선택하고 싶어서 [3.0.0, 3.1.0)와 같은 버전 범위를 사용하면 3.0.0.RELASE, 3.0.5.RELASE와 같은 버전은 아예 찾지 못해서 에러가 난다. 의존 관계를 따져보다 버전이 충돌이 났을 때 2.5.6과 3.0.5.RELASE 두개의 같은 라이브러리가 발견되면 2.5.6을 더 최신으로 해석해버리기도 한다. 3.0.5.RELASE와 같은 포맷을 제대로 인식 못하기 때문이다. 게다가 Maven은 a,b,c 없이 d만 존재하는 버전을 허용하기 때문에 에러도 안난다. 그냥 0.0.0 버전이면서 식별자가 3.0.5.RELEASE라고 지정된 것이라고 해석해버린다. 게다가 내부에서 해석한 버전 정보는 아무리 로그레벨을 낮춰도 출력이 안되기 때문에 개발자 입장에서는 이게 안되면 매우 난처할 수 밖에 없다.

이 문제는 오래전 2.0.x 시절부터 계속 지적된 것이지만 Maven 개발자들은 3에서 개선하겠다고만 하고 2.x대는 버전 처리 방식은 그대로 방치해 두었다. 오픈소스긴 하지만 오픈 프로젝트는 아닌지라 커뮤니티의 불만이나 의견 따위는 독선적인 소수 커미터들에게 그렇게 무시당하기 일수다.

아무튼.. 소스를 디버깅해가면서 버전 처리 방식을 연구하게 만들만큼 한동안 나를 괴롭혔던 이 문제는 3.0에서 해결 됐다.

이제는 [3.0.0,3.1.0)이라고 버전을 지정하면 정확하게 3.0.5.RELASE를 가져온다. STS 2.5.0에서 Maven 2.2.1과 3.0을 바꿔가며 비교해봤을 때 확실하게 버전 처리 방식이 달라진 것을 확인할 수 있었다. 이제는 3.0.0.RELASE를 3, 0, 0, RELEASE로 정확히 해석하는 것 같다. 내부 리포지토리로 Nexus 1.8을 적용했는데 3.0의 새로운 버전 해석 방식과 잘 호환된다.

개선된 버전 처리 방식 하나 때문에라도 앞으로는 3.0을 사용해야겠다.

Related posts:

  1. Nexus Maven Repository 1.0 출시
  2. Maven 다중 리포지토리와 버전 범위를 사용할 때의 주의점
  3. Maven의 새로운 가이드북 – Maven: The Definitive Guide
  4. Maven 재도전기 (1)
  5. Spring 3.0 (34) R-941 스프링의 Maven 지원정책은?
  6. Maven 의존관계 수렁에 빠지다
  7. Maven: The Definitive Guide 사라지다
  8. Maven settings.xml의 비밀번호 암호화
  9. Maven archetype 설정파일 자동생성기 – ArchetypeXmlWriter
  10. Ruby on Maven
  11. Maven POM에 attribute 사용하기 (1)
  12. Maven POM에 attribute 사용하기 (2)
  13. Maven과 OSGi(Spring)의 버전포맷 비호환 문제
  14. Maven의 version range를 사용할 때 주의할 점
  15. 유쾌한 이슈처리 재촉 메일

Facebook comments:

to “Maven 3.0과 버전 포맷 문제”

  1. 최신버전 STS에 기본으로 설치되는 m2eclipse도 메이븐 3.0 쓰나요?

  2. 기선/ STS랑 같이 설치되는 2.2.1를 쓰게 되어있지. ROO때문인 듯.

  3. Weeeee, what a quick and easy sloution.

  4. thanks for share!

  5. thank you for share!

  6. thank you for share!

  7. Have A Peek At THIS Web-Site
    ugg outlet online http://outlettonlineshop.com

  8. Why not try this out
    mens ugg slippers http://mensbootsoutlet.com

  9. mbt shoe Maven 3.0과 버전 포맷 문제 » Toby’s Epril

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha