"import"범위가있는 "import"와 "import"가없는 "pom"유형 종속성의 차이점은 무엇입니까?


112

Maven 2.0.9부터 다음을 포함 할 수 있습니다.

<type>pom</type>
<scope>import</scope>

<dependencyManagement>섹션을 참조하십시오.

내가 이해하는대로, 마치 원래 여기에 정의 된 것처럼이 pom에 포함 된 종속성으로 "대체"됩니다.

위의 솔루션과 import범위가 없는이 pom에 대한 간단한 종속성의 차이점은 무엇입니까 (후자는 "종속성 그룹화"라고 함)? 이러한 "그룹화 된"종속성이 종속성 우선 순위를 해결하는 동안 우선 순위가 낮다는 유일한 차이점이 있습니까?

답변:


187

관리되는 종속성 만 가져올 수 있습니다 . 즉 , 프로젝트의 POM 섹션으로 다른 POM 만 가져올 수 있습니다 dependencyManagement. 즉

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>other.pom.group.id</groupId>
            <artifactId>other-pom-artifact-id</artifactId>
            <version>SNAPSHOT</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>   
    </dependencies>
</dependencyManagement>
...

그러면의 dependencyManagement섹션에 정의 된 모든 종속성 other-pom-artifact-id이 POM dependencyManagement섹션에 포함됩니다 . 그런 다음 등 dependency을 포함하지 않고도 POM (및 모든 하위 POM) 섹션 에서 이러한 종속성을 참조 할 수 있습니다 version.

그러나 POM에서 단순히 일반 종속성을 정의하면 의 섹션에있는 other-pom-artifact-id모든 항목이 프로젝트에 전 이적으로 포함되지만의 섹션에 정의 된 종속성 은 전혀 포함되지 않습니다.dependenciesdependencyother-pom-artifact-iddependencyManagementother-pom-artifact-id

따라서 기본적으로 두 가지 다른 유형의 종속성 (관리 종속성 및 일반 종속성)을 가져 오거나 포함하는 데 두 가지 다른 메커니즘이 사용됩니다.

Maven 웹 사이트에는 내가 할 수있는 것보다 훨씬 잘 설명 할 수 있는 Maven의 Dependency Management 페이지가 있으며 종속성 가져 오기에 대한 특정 정보도 포함되어 있습니다 .


1
경우 pom(A)에이의 부모 인 pom당신은 범위와 프로젝트 A의 의존성 관리에 B를 배치 할 수 있습니다, B import?
Janez Kuhar

작동 방식을 설명하는 훌륭한 대답이지만 왜 ?? 다른 종속성을 전 이적으로 포함하고 싶지 않은 이유는 무엇입니까? 둘 다 할 수 있습니까? other-pom-artifact-id를 가져온 다음 other-pom-artifact-id를 종속성으로 선언 하시겠습니까?
Junchen Liu 2016

: DZone에 한 기사는 뭔가 다른 상태 ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-lib</artifactId> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>pomlib-war</artifactId> <type>war</type> </dependency> </dependencies> </project>DRY와 스키니 전쟁
사촌

1
@JunchenLiu : 프로젝트 A의 몇 가지 기능 만 사용하고 있으므로 해당 기능에 필요한 전 이적 종속성 만 포함하도록 선택할 수 있습니다. <dependency>에서도 <exclude>를 사용하여 해결할 수 있습니다. 예를 들어이 체크 아웃 jdbi.org/#_getting_started
Nitiraj

15

다른 프로젝트에서 pom형식 프로젝트를 가질 수 없습니다 simple dependency. (글쎄, 당신은 할 수 있지만 유용한 것은 없습니다). parent-child관계 만있을 수 있습니다 . 이것은 본질적으로 managing dependency through inheritance입니다.

import섹션의 pom유형 종속성에 대한 범위를 <dependencyManagement>사용하면 multiple inheritance.

당신은 다른 가질 수 poms- 각 managing관련 의존성의 무리. 이 수 사용하는 사업 importpoms다음과 그들이 버전에 대해 걱정할 필요없이 필요로하는 종속성을 지정합니다. 이것은 본질적 bill of materials으로 @ DB5에 지정된 링크에 설명 된 개념입니다.

이렇게하면 parent poms복잡한 다중 모듈 프로젝트가 너무 커지고 다루기 어려워지는 것을 방지 할 수 있습니다.


8
확실합니까? 다른 프로젝트 (패키징 전쟁)의 일반 종속성으로 일반 pom (자체 종속성 있음)을 넣고 대상 프로젝트의 WEB-INF / lib에 포함 된 pom 프로젝트의 모든 종속성을 얻었습니다. 그것이 내가이 질문을하는 이유입니다 :)
grafthez 2012-08-02

2
@Raghuram에게 감사드립니다. 질문에 답할 때 부모 POM 옵션을 언급하는 것을 완전히 잊었습니다. pom 유형 프로젝트를 간단한 종속성으로 갖는 경우 가능합니다. 원래 질문에서 언급했듯이 종속성
DB5


5

객체 지향 프로그래밍 패러다임과 매우 유사한 두 가지 개념이 질문에 답하는 데 도움이됩니다.

  1. dependencyManagement의 섹션은 현재 프로젝트의 의존성과 세부 사항을 선언 - 목적 중 하나 상속을 통해 (다른 프로젝트에 대한 자세한 내용과 재사용의 관리입니다 부모 ) 또는 수입 ( 범위 ). 이것은 프로그램에서 데이터 유형을 선언하고 사용 가능하게 만드는 것과 같습니다.

  2. 종속 섹션은 선택적으로 아래에 선언 된 종속성은 세부 사항 (즉, 버전 등) 상속 프로젝트에 종속성의 실제 사용을 정의 dependencyManagment . 당신은 단지에 넣어 경우 누락 된 종속성을해야합니다 이유입니다 dependencyManagment . 이는 필요한 프로그램에서 데이터 유형의 변수 인스턴스를 인스턴스화하는 것과 유사합니다.


훌륭하고 명확하지만 위의 질문과 다른 질문에 답합니다. :-)
Rick-777
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.