Whiteship's Note


기본적인 managed dependency 사용법

Build/Maven : 2008.04.17 15:22


사용자 삽입 이미지


A BOM은 오타가 아닙니다. Bill Of Material 이라는 뜻입니다. B POM은 그냥 보통의 POM 입니다. 위의 경우 A BOM(얘도 결국은 packing이 POM입니다.)을 B POM이 상속 받고 있습니다. 상속 받으면 모든 부모의 모든 속성을 자식 입장에서 사용할 수 있습니다. 따라서 A에 정의한 DM(dependecy management) 섹션도 B POM으로 상속이 됩니다.

B POM에서는 한 개의 라이브러리를 추가합니다. 그런데 버전과 스콥을 명시하지 않고 있습니다. 오호.. 이러면 안 되죠. 원래는 버전까지는 꼭 명시해줘야 합니다. 버전을 적어주지 않으면 메이븐이 종속성 추가하닥 에러 납니다. 그런데 위의 경우에는 에러가나지 않습니다. 명시한 groupId와 artifactId에 해당하는 종속성의 Bill Of Material이 DM 안에 들어있기 때문입니다. DM을 보구서.. 아항..whiteship의 a라는 라이브러리는 1.0이고 runtime scope으로 추가해야 하는 군... 이라고 알아챕니다.

이런게 언제 유용할 까요.

whiteship의 a라는 라이브러리를 runtime scope으로 참조하는 다른 프로젝트들 C POM, D POM, E POM 등이 있을 때 매번 C, D, E에도 다음과 같은 코드가 들어갈 겁니다.

<dependency>
<groupId>whiteship</groupId>
<artifactId>a</artifactId>
<version>1.0</version>
<scope>runtime</version>
</dependency>

그런데 위의 A BOM을 상속 받으면

<dependency>
<groupId>whiteship</groupId>
<artifactId>a</artifactId>
</dependency>

이렇게만 설정해 됩니다.

그런데.. Spring BOM, Hinbernate BOM, Test BOM과 같이 여러 종류의 BOM이 있으면 어떻게 해야 할까요? 단일 상속 밖에 안 되는데.. 그럼 managed dependency는 못 쓰는걸까요?

네 못 씁니다. Maven 2.0.9 이전까지는 그냥 일일히 버전과 scope 명시해 줘야 합니다. 그런데 몇일전에 2.0.9가 나왔죠. 캬캬캬. 몇일동안 끙끙 앓고있던 문제인데 풀고나니 별거 아니네요. 이론...

 이제 남은일은 이 기능을 이용해서 어떻게 효율적인 BOM과 POM을 구성하느냐 입니다.

봄폼봄폼봄폼봄폼봄폼폼폼봄봄봄폼봄폼봄봄봄폼폼
top


Managed Depedency 네 녀석의 정체를 드디어 알았다.

Build/Maven : 2008.04.17 14:59


참조:
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism
http://maven.apache.org/ref/current/maven-model/maven.html#class_dependencyManagement

이 녀석의 정체는... depedency 정보(버전, Scope, 추이성)을 한 곳에 정리해둔=MANAGED 의존성=Denpendency을 사용하겠다는 것입니다. Maven 2.0.9에 추가된 import managed dependency는 바로 이 managed dependency에 관한 내용입니다.

이전에는 상속을 통해서 managed dependency를 이용할 수 있었습니다.

그런데 단일 상속만 되기 때문에 managed dependency를 사용하고 싶은 프로젝트가 여러 개일 때는 import scope을 이용해서 상속이 아닌 위임delegation을 사용해서 여러 개의 프로젝트를 import scope으로 dependencyManagement에 추가해두면, 해당 프로젝트들이 가지고 있는 managed dependency를 사용할 수 있습니다.

이 개념을 이해하기 위해.. 거의 삼일간 고생했네요.

처음에는

<dependencies>
  <dep..cy>
     ..
  </dep..cy>
  <dep..cy>
    ..
  </dep..cy
  ..
</dependencies>

이거랑

<dependencyManagement>
<dependencies>
  <dep..cy>
    ..
  </dep..cy>
  <dep..cy>
   ..
  </dep..cy
  ..
</dependencies>
</dependencyManagement>

이거랑 별 차이가 없는 건 줄 알았는데...

엄청나게 많은 차이가 있었습니다.
top


Managed dependency는 무슨 뜻인가요?

Build/Maven : 2008.04.14 21:43


스프링 DM을 읽다가도 managed destroy라는 단어를 보고.. 이게 무슨 말인가 곰곰히 생각을 한 적이 있었는데요. 오늘도 저 단어를 만나서 고생을 했습니다. Maven 2.0.9에 새로 추가된 import managed dependency를 적용해보려고 했는데, 한바탕 Maven 지옥에 들락거리다 지쳐서 오늘은 실패를 기록하고 이만 집에 들어가려고 합니다.

Managed Dependency 넌 대체 무엇이니?
As an example, consider the following projects:

   1. ThirdParty 1.0 - contains declarations of third party jars.
   2. Project A 1.0 - A project that uses declarations in ThirdParty and produces some number of versioned artifacts.
   3. Project B 1.0 - A project unrelated to Project A. It also uses declarations in ThirdParty and produces some number of versioned artifacts.
   4. Project C 1.0 - Has dependencies on ThirdParty, Project A, and Project B.

In Maven 2 it is not possible for Project C to use the managed dependencies from both A and B since neither has any direct relationship to the other.
참조: http://docs.codehaus.org/display/MAVEN/Importing+Managed+Dependencies

이게 무슨 이야기인지 이해가 안 되고 있습니다.

C가 A랑 B를 dependency에 추가하면, A와 B가 사용하는 dependency들도 C에 추가되어서 C프로젝트에서도 사용할 수 있는데, 대체 MD가 뭐길래.. C에서 사용하는게 불가능한 걸까요.
top