2011-01-11 2 views
4

나는 다음과 같은 상황에 대한 접근 방법을 결정하기 위해 노력하고있어 :Maven : 직접적이고 전 이적 인 의존성을 어떻게 처리합니까?

3 개 메이븐의 유물이있다 : A는, B 및 C는

B가 A에 따라 (즉 그것은의 일부 코드를 사용합니다)

C는 A와 B에 의존합니다 (즉, A의 코드와 B의 코드 중 일부를 사용함).

내가 사용해야 어떤 방식 모두 B와

C.

에 대한 동일한 버전을 사용한다고 가정?

1) A를 C의 pom.xml에 종속성으로 선언하십시오.

Pro : C가 A.에 달려 있음이 분명합니다. Con : A의 버전이 변경되면 여러 곳에서 업데이트해야합니다. (B와 C 모두)

2) A를 C의 pom.xml에 종속성으로 선언하지 마십시오.

프로/단점 : 옵션 1.

+0

오타 : "C는 A와 C 모두에 달려있다"라고 말하면 'C가 A와 B 모두에 달려있다'라고 생각합니다. – Nishant

+0

맞습니다. 오타가 수정되었습니다. –

답변

3

1)의 반대는 C의 pom.xml 파일에 종속 같이를 선언합니다.

종속성은 읽을 수 있습니다.

종속성은 유연합니다. B에서 A의 종속성을 제거하려면 B에 의존하는 프로젝트를 생각할 필요가 없습니다.

other answer에서 제안 된 것처럼 pom.xml에 직접 종속성을 적어두고 maven이 처리하도록 허용하는 것이 좋습니다. 그것.

2) C의 pom.xml에서 A를 종속으로 선언하지 마십시오.

대부분 개발자는 pom.xml을 보지 않습니다. 그리고 그들이 원하는 경우 그들은 mvn dependency:tree을 사용하여 그것을 볼 수 있고 그것은 전이 의존성을 보여줄 것입니다.

A의 새 버전이 릴리스 될 때 단일 변경 지점이 있습니다. 둘 이상의 위치에서 종속성을 정의하면 모든 장소를 업데이트하는 것을 잊어 버릴 수 있습니다. 이 경우, Maven은 자동으로 최신 것을 사용합니다. 그러나 때로는 찌르다.

대부분이 유형의 종속성은 일반적인 지식 (예 : MyWebApp -> MyWebAppLib -> MySharedLibMyWebApp -> MySharedLib)이며 각 릴리스의 여러 위치에서 버전을 업데이트하는 단계를 피하기를 원하는 경우가 있습니다.

나는 장단점을 적어 놓았으므로 자신에게 가장 맞는 것을 평가해야합니다.


편집 # 1 : 쯧! 나는 내 의견을 바꾸었다.
# 2 편집 :this answer에서 진행된 토론 후 답변을 업데이트했습니다.

+0

@Jin Kim 옵션을 잘못 읽었습니다. 그래서 잘못된 순서로 주석을 달았습니다. 고쳤다. – Nishant

+0

옵션 (A)는 옵션 (1)을 의미합니까? –

+0

@ 김 킴 나는 어떤 의미로 만들기 위해 글을 업데이트했다. 나는 당신의 옵션을 잘못 붙였다. – Nishant

4

당신은 모든 직접적인 의존성을 당신의 pom에 선언해야한다고 생각합니다. 전이 종속성은 종속성 종속성을 자동으로 해결하는 데 편리합니다.

직접 종속성의 버전을 변경하면 전 이적 종속성이 변경되어 모듈을 손상시킬 가능성이 있습니다. 모듈은 독립적 인 유닛으로 빌드되어야하므로 외부 변경으로 인해 중단되지 않는 잘 정의 된 종속성이 있어야합니다.

필자는 maven이 단일 프로젝트와 해당 작업 영역의 경계 내에서 사물을 정의하므로 DRY 주체를 위반한다고 동의합니다. 그리고이 범위 내에서 반복은 없습니다.

업데이트 : 기존의 이적 종속에 대한 의존도가 자신의 프로젝트를 허약하게하고, 또한 그것을 포함하는 경우와 같은 더 복잡한 문제가 발생할 수 있습니다.

예를 들어, C에 A에 대한 컴파일 종속성이 있지만 B에 대한 런타임 종속성이있는 경우 종속 경로를 빌드 경로에 더 이상 넣지 않아도되므로 종속성을 추가하거나 컴파일 할 때 B를 선언해야합니다. 그렇지 않습니다. 명확성을 위해 언급 할 것이 많습니다. 종속성이 무엇인지, 범위가 무엇인지를 명시 적으로 정의하고 종속성이 동일하게 적용될 것으로 기대하십시오. 대부분의 경우 종속성은 문제를 일으키고 열어야 만 할 때까지 블랙 박스입니다.

+0

classpath에 동일한 이슈/jar의 두 가지 버전이 있으면 엉망이 생길 수 있습니다 (Jar-hell). 종속 프로젝트 (B와 C) 모두에서 단일 버전을 원할 가능성이 큽니다. A의 버전을 업데이트하려면 두 POM (반복)에서 동일한 것을 업데이트해야하거나 버전 문제가있을 수 있습니다. 그것이 내가 드라이를 언급 한 이유입니다. – Nishant

+1

사실 C는 A에 의존하며 명시 적으로 명시해야합니다. 전이 의존성'C -> B -> A '는 B의 구현 세부 사항이며 변경 될 수 있습니다. 당신은 그것에 대해 알거나 신경 쓰지 않아야합니다. 실제로 JAR 버전의 지옥으로 이어질 수는 있지만, Maven의 일부인 툴체인에서 경고를 받고 그러한 문제를 해결하는 데 도움이되어야합니다. –

+1

@Nishant - 메이븐이 항아리를 처리하도록 두었습니다. 클래스 패스에 두 개를 넣지 않았습니다. 어느 것을 넣을 지 결정합니다. 내가 말한 것처럼, 프로젝트는 독립적이며 그렇게 구성되어야합니다. 전 이적 종속성에 대한 의존도는 프로젝트가 외부 변경으로 인해 더 취약 해지기 때문에 종속성이 실제로 무엇인지 쉽게 이해하기 어렵게 만듭니다. – Robin

관련 문제