Spring 3.0의 최신 소스를 빌드해서 사용하는 방법을 알아봤던 이전 글에서 지적했듯이 Maven의 버전관리 기능은 주의하지 않으면 큰 혼란을 일으킬 수 있다.

 

Maven Version

메이븐의 비공식 매뉴얼인 Maven: The Definitive Guide에 소개된 Maven의 버전포맷은 다음과 같다. (참고로 Maven 개발팀은 버전설정과 관련한 공식문서를 준비하자는 이슈를 등록하고.. 질질 끌고 있다)

<major version>.<minor version>.<incremental version>-<qualifier>

Major,minor,incremental 버전은 모두 0 또는 이상의 숫자여야 한다. Qualifer에는 다시 build no가 들어갈 수 있지만 현재(2.0.9)는 무조건 문자로 처리되어 비교되므로 build no 개념은 별 의미가 없다.

위의 포맷의 모든 요소는 모두 optional이다. 대신 major version과 qualifier 중의 하나는 반드시 존재해야 한다.

문제는 위의 포맷과 비슷해보이지만 정확히 맞지 않는 경우 Maven은 에러를 내는 것이 아니고 전체 버전을 임의의 스트링 값을 가질 수 있는 qualifier로 취급해버린다는 것이다.  바로 이점이 Maven의 버전을 사용할 때 위험한 부분이다.

예를 들어 1.0-M1은 major=1, minor=0, incremental=0, qualifier=M1으로 파싱되지만 1.0.M1은 major=0, minor=0, incremental=0, qualifier=1.0M1으로 파싱되다는 점이다. 대쉬(-) 앞에 숫자와 점(.)으로 이루어진 버전이 나오고 그 외에는 모두 qualifier라는 규칙 때문에 1.0.M1은 표준 포맷으로 파싱이 불가능하고 숫자버전은 모두 0이고 1.0.M1이 qualifier로 취급되어 버린다.

POM 설정에서 정확히 일치하는 버전을 단 한번만 사용한다면 별 문제가 문제가 없다.

하지만

  • 버전범위(version range)를 사용하는 경우
  • 같은 아티팩트의 다른 버전이 동시에 존재하는 경우 그것을 자동으로 해결의 경우
  • RELEASE, LATEST와 같이 최신버전을 자동으로 선택하는 경우

에는 문제가 될 수 있다. 3.0.0.BUILD-001 보다 2.5.6이 더 최신버전이라고 판다하는 식의 문제가 생기기 때문이다.

따라서 Maven을 사용할 경우에는 최소한 숫자버전이 정확히 들어가도록 표준 포맷을 따라서 버전을 붙여야 한다.

표준을 지키지 않는 포맷을 아무런 경고 메시지조차 없이 허용하고 상당한 혼란을 줄 수 있다는 면에서 Maven 개발자들의 무책임함이 느껴지는 부분이지만, 뭐 어쨌든 Maven이 정한 룰이니까 잘 따르면 될 것이라고 생각할 수 있다.

 

OSGi Version

문제는 OSGi 번들이다. OSGi 번들로 패키징된 라이브러리나 아티팩트의 사용이 점차로 늘고 있다. 당장에 Eclipse의 모든 번들이 그렇고, 스프링이 OSGi/DM에 올인하면서 스프링 모듈을 포함해서 대표적인 라이브러리를 OSGi번들호환으로 재포장해서 제공하고 있는 리포지토리의 사용이 그렇다.

OSGi는 Maven과 유사해보이지만 큰 차이가 있는 버전포맷을 가지고 있다. 다음은 OSGi 스펙에 나오는 버전포맷이다.

version ::= major( ‘.’ minor ( ‘.’ micro ( ‘.’ qualifier )? )? )?
major  ::= number                   // See 1.3.2
minor ::= number
micro ::= number
qualifier  ::= ( alphanum | ’_’ | ‘-’ )+

여기서 ()는 grouping, ?는 optional이라는 뜻이다.

OSGi도 major,minor,micro라는 세단계 숫자로된 버전을 가지고 있다. 문제는 그 다음 qualifier가 나오는 부분인데, 그 구분자가 점(.)으로 되어있다는 것이 대쉬(-)를 사용하는 Maven과 다르다.

또 OSGi의 qualifier는 micro버전까지 나온 뒤에만 적용할 수 있다. 즉 1.0.0.M1 이라고는 쓸 수 있지만 1.0.M1이라고는 사용할 수 없다는 뜻이다. 하지만 Maven은 구분자 자체를 별도로 해놨기 때문에 1.0-M1이라고 쓸 수 있다. 이 것이 각각의 qualifier를 위한 구분자를 다르게 사용한 이유인지도 모르겠다.

 

문제는 스프링소스가 제공하는 OSGi호환 번들의 버전은 OSGi 버전포맷을 따른다는 점이다. 이부분에서 Maven의 버전과 충돌이 일어난다. 물론 Maven의 나이브함 때문에 에러가 나지 않고 정상적으로 처리되는 듯 하나, 내부적으로 보자면 큰 차이가 있고 결국 버전처리에 혼란을 가져올 수 밖에 없다.

예를 들어 스프링의 번들을 기준으로 보자면

스프링소스의 리포지토리에서는 2.5.6과 2.5.6.A가 모두 제공된다. 여기서 qualifier A가 붙는 것은 패키징에 미묘한 수정이 있기 때문이다. 하지만 이 두개의 번들을 Maven에서는 완전히 다른 버전으로 인식한다.

2.5.6은 정상적으로 2,5,6의 세가지 버전을 가진 표준 포맷으로 보지만

2.5.6.A는 OSGi의 표준에 맞는 정확한 버전구조를 가졌지만 2.5.6 바로 뒤에 나올 수 있는 버전이 아니라 Maven에서 보기에는 0,0,0버전에 2.5.6.A라는 qualifier를 가진 버전으로 해석이 된다는 말이다. 현재 공식버전인 2.0.9를 포함해서 2.0.x의 최신 브랜치와 새로운 2.1.x의 브랜치의 Maven을 가져다 테스트해봐도 동일하다. 아직 alpha1인 3.0은 테스트 해보지 않았다.

결국 이부분이 이전에 지적한 Maven의 버전범위 비교방식으로 적용해보면 2.5.6.A가 2.5.6보다 훨신 옛날 버전이 되버린다.

 

버전 사용에 대한 주의

결론적으로 이러한 차이가 가져오는 문제점은 경우에 따라 심각한 결과 내지는 혼란을 초래할 수 있기 때문에 주의해야 한다. 특히 스프링이 제공하는 모듈과 OSGi 번들을 사용할 경우는 더욱 그렇다.

당연하게도 Maven 내부에서 이부분에 대한 문제제기와 어설픈 Maven의 버전체계를 정리하자는 요구가 지속적으로 나오고 있다. 당장에 OSGi와의 버전차이에 관한 문제나 빌드넘버 문제 등은 사용자들의 패치가 제공되는 등의 수정을 요구받고 있다. 하지만 적용되고 있지 않고 있다. 몰려가서 vote를 해야 할까.

이부분에 대한 근본적인 해결책은 Maven의 버전체계를 종합적으로 개선하는 것까지 가야 할 듯 하다. 이에 대해서 괴민을 많이 했던 한 개발자가 정리해놓은 Maven Versioning이라는 위키문서에 그런 내용이 잘 정리되어있다. Maven 사용자라면 주의 깊게 읽어볼만 하다.

Maven은 무려 3개의 브랜치(2.0.x, 2.1.x, 3.0.x)가 동시에 개발되고 있는 복잡한 프로젝트이다. 이런 저런 버그와 불편함으로 욕도 엄청나게 먹어왔다. 그래도 m2eclipse,nexus와 같은 쓸만한 툴의 개발을 지원하는 등을 보면 바른 방향으로 나아가고 있는듯 하다. 리포지토리 개념을 공유하는 Ant/Ivy와 Buildr같은 툴들도 등장했다.

이 Maven 버전문제 제대로 확인하겠다고 Maven을 수정해서 직접 빌드하고 테스트 하는등의 작업을 하면서 오전시간을 거의 날려버렸다. 부디 이 버전 문제만큼은 좀 빨리 해결되었으면 좋겠다. 마음 같아서는 위의 이슈에 올라온 패치를 적용해서 쓰고 싶기도하다. 다른 개발자들과 혼란이 생길테니 그럴 엄두는 못내겠지만.

 

이름은 참 좋은데…

ma·ven  n. 《미·속어》 숙달한 사람, 프로, 명수(expert) 

Related posts:

  1. Maven의 version range를 사용할 때 주의할 점
  2. Spring-OSGi 시작하기 – OSGi
  3. JCO컨퍼런스와 Spring Dynamic Modules for OSGi(tm)
  4. Spring Dynamic Modules for OSGi(tm) 한글 레퍼런스 자료
  5. SpringOne 2008 (1) – OSGi
  6. SpringDM과 차세대 OSGi
  7. Small Team의 기준 / OSGi-S2AP 그게 왜 필요한데?
  8. IBM DeveloperWorks – SpringDM for OSGi 스크린캐스트 첫번째 공개
  9. Maven 3.0과 버전 포맷 문제
  10. Spring 3.0 (4) – Maven에서 Spring 3.0 최신버전 사용하기
  11. Maven 다중 리포지토리와 버전 범위를 사용할 때의 주의점
  12. Spring 3.0 (34) R-941 스프링의 Maven 지원정책은?
  13. Spring 3.0 (1) 프로젝트 구조와 빌드 시스템의 변화
  14. Spring 3.0 (25) Spring 3.0 빌드, 배포, 모듈과 라이브러리의 의존관계 분석 그 이후
  15. Spring 3.0 (27) R-599 JDK1.5+ Concurrent

Facebook comments:

to “Maven과 OSGi(Spring)의 버전포맷 비호환 문제”

  1. ‘자동으로 해결의 경우’가 뭐야.
    영 어색한데.. 해결이 resolve를 말하는건가?

  2. 역자 안영회/ resolve a conflict = 충돌을 해결하다
    The ThoughtWorks Anthology 나오면 두고 보자.

  3. Hello! aeffdbd interesting aeffdbd site! I’m really like it! Very, very aeffdbd good!

  4. Hello! eaecaed interesting eaecaed site! I’m really like it! Very, very eaecaed good!

  5. We have decided to open our POWERFUL and PRIVATE web traffic system to the public for a limited time! You can sign up for our UP SCALE network with a free trial as we get started with the public’s orders. Imagine how your bank account will look when your website gets the traffic it deserves. Visit us today: http://bag.sh/16M

  6. Hello! kbeggdd interesting kbeggdd site! I’m really like it! Very, very kbeggdd good!

  7. Hello! fddbdbb interesting fddbdbb site! I’m really like it! Very, very fddbdbb good!

  8. This is a message to the webmaster. I came to your “Mavenê³¼ OSGi(Spring)의 버전포맷 비호환 문제 » Toby&” page via Google but it was hard to find as you were not on the first page of search results. I know you could have more visitors to your website. I have found a website which offers to dramatically increase your rankings and traffic to your site: http://nsru.net/zaj5 I managed to get close to 1000 visitors/day using their services, you could also get lot more targeted traffic from search engines than you have now. Their service brought significantly more traffic to my website. I hope this helps, happy new year!

  9. A large percentage of of the things you assert is supprisingly appropriate and that makes me ponder why I hadn’t looked at this with this light before. This article really did switch the light on for me as far as this specific issue goes. However there is actually just one point I am not necessarily too comfortable with so while I try to reconcile that with the main idea of the issue, allow me observe exactly what all the rest of the visitors have to say.Well done.

  10. mbt shoes outlet Maven과 OSGi(Spring)의 버전포맷 비호환 문제 » Toby’s Epril

  11. shoes mbt Maven과 OSGi(Spring)의 버전포맷 비호환 문제 » Toby’s Epril

  12. サッカー スパイク プレデター リーサル ゾーンその後、さらにモスバーガーで海老竜田ライスバーガーを食べ(喰い過ぎ)さらにその足で3時間も漫画喫茶でまったり。3時間も「鉄拳チンミ」を読み満足。また行く。ゴアテックスがない時代にはこれが普通です。欠点としては折角のゴアテックスの透湿性能が発揮されにくいことでしょう。革自体は油分を含んでも水分は吸収しますからその分はメンンブレンの内から外へ排出されます。
    サッカー ユニフォーム ユベントス「むくみ」といっても、心臓や腎臓、肝臓など全身的な病気がともなっている場合は、当然そちらを優先的に治療する必要がある。だが、内臓器官にこれといった大きな障害がない場合でも、前述したように「むくみ」は起きる。それをどんな方法で防ぎ、対処していくか。今年は、母に胡桃のバター(マーガリン)を送りたいと思います。母が胡桃好きなのと、パンに塗るとおいしい。といううたい文句に惹かれて買いました。
    サッカー スパイク ティエンポ私はショットガン使いになるまえは、やつらのカモだったもんあ、そうそう。助に「クリムゾンヘッドはどう倒してる?」って聞いたら……そんなモルさんの質問に助さんはどうやって対戦していたのかをマンガにしてもらいました。題して「キミは本当に……」です。次に『タンバ』は靴とバッグを選り分けた。玄関の靴箱に入りきらない靴は、すべて『いらない物ボックス』行き。バッグもかなりの場所を占めていたので、クローゼットの中にはずいぶんと余裕が出来たところが彼は収納し直したばかりの洋服をいくつも引っ張り出してベッドの上に並べだしたのだ。
    ナイトロチャージ 1.03度目のゴールデングラブ賞を受賞2003年、不調や怪我が重なり、規定投球回数にも届かず6勝、防御率6.84と不本意な成績に終わり、連続2桁勝利・連続防御率10傑入りの記録が共に7年で途絶える2004年、禁煙・食事制限など節制に努め復活を期し、3度右足内転筋を痛めるなどアクシデントはあったものの、10勝を挙げる。FA権を取得するが行使せず西武に残留。「これから西武で何勝できるかやってみたい」という生涯西武ともとれる発言をしている2005年、セ・パ交流戦で6勝を挙げ、交流戦初代最多勝投手に。ブランド紹介 : 古き良きアメリカの姿を残し、靴の生産地としても有名な町、アメリカのメイン州にある「SCARBOROUGH(スカボロー)」からブランド名は由来しています。アメリカ開拓時代を生き抜いた男たちをも支えたであろう靴。頑丈で、それでいて履きやすい、丁寧に作られた靴。

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