[maven-2] dependencymagement와 의존성의 차이점



4 Answers

나는이 질문에 유행에 뒤늦지 만 받아 들인 대답보다 명확한 응답이 가치가 있다고 생각한다. (정확한 것은 사실이지만 중요한 부분은 강조하지 않는다.

부모 POM에서 <dependencies><dependencyManagement> 의 주요 차이점은 다음과 같습니다.

<dependencies> 섹션에 명시된 아티팩트는 항상 하위 모듈의 종속성으로 포함됩니다.

<dependencyManagement> 섹션에 지정된 아티팩트는 하위 모듈 자체의 <dependencies> 섹션에도 지정되어있는 경우에만 하위 모듈에 포함됩니다. 왜 당신이 물어 보는 것이 좋은가요? 부모에서 버전 및 / 또는 범위를 지정하고 하위 POM에서 종속성을 지정할 때이 버전 및 / 또는 범위를 생략 할 수 있기 때문입니다. 이렇게하면 각 하위 모듈에 버전을 지정하지 않고 하위 모듈에 대한 종속성에 통합 된 버전을 사용할 수 있습니다.

Question

dependencyManagementdependencies 의 차이점은 무엇입니까? Apache Maven 웹 사이트에서 문서를 보았습니다. dependencyManagement에 정의 된 dependencyManagement 은 버전을 지정하지 않고 자식 모듈에서 사용할 수 있습니다.

예 :

상위 프로젝트 (Pro-par)는 종속성 관리 아래 종속성을 정의합니다.

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8</version>
    </dependency>
 </dependencies>
</dependencyManagement>

그렇다면 프로 파 (Pro-par)의 자녀는 junit을 사용할 수 있습니다.

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
 </dependencies>

그러나 부모 pom에 junit을 정의해야하는지 궁금합니다. 왜 그것을 필요한 모듈에서 직접 정의하지 않습니까?




메이븐 사이트의 문서 는 끔찍합니다. dependencyManagement가하는 일은 단순히 의존성 정의 (버전, 제외 등)를 상위 pom으로 이동 한 다음 하위 폼에서 groupId 및 artifactId를 넣기 만하면됩니다. 부모 덤프 체킹 (parent pom chaining) 등을 제외하고는 그렇지만, 그게 사실 복잡하지는 않습니다 .- 의존성 관리가 부모 레벨의 의존성을이기는 것입니다.하지만, 그 또는 수입에 관한 질문이 있다면, Maven 문서가 조금 낫습니다.)

Maven 사이트에서 'a', 'b', 'c'가비지를 모두 읽고 혼란 스러울 때, 나는 그들의 예를 다시 썼다. 따라서 공통 종속성 (betaShared)을 공유하는 2 개의 프로젝트 (proj1과 proj2)가 있다면 그 종속성을 상위 pom으로 이동할 수 있습니다. 그 동안 프로젝트에 의미가있는 경우에만 다른 의존성 (알파와 찰리)을 올릴 수도 있습니다. 따라서 앞 문장에 설명 된 상황에서 부모 POM에 dependencyManagement가있는 해결책이 있습니다.

<!-- ParentProj pom -->
<project>
  <dependencyManagement>
    <dependencies>
      <dependency> <!-- not much benefit defining alpha here, as we only use in 1 child, so optional -->
        <groupId>alpha</groupId>
        <artifactId>alpha</artifactId>
        <version>1.0</version>
        <exclusions>
          <exclusion>
            <groupId>zebra</groupId>
            <artifactId>zebra</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>charlie</groupId> <!-- not much benefit defining charlie here, so optional -->
        <artifactId>charlie</artifactId>
        <version>1.0</version>
        <type>war</type>
        <scope>runtime</scope>
      </dependency>
      <dependency> <!-- defining betaShared here makes a lot of sense -->
        <groupId>betaShared</groupId>
        <artifactId>betaShared</artifactId>
        <version>1.0</version>
        <type>bar</type>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

<!-- Child Proj1 pom -->
<project>
  <dependencies>
    <dependency>
      <groupId>alpha</groupId>
      <artifactId>alpha</artifactId>  <!-- jar type IS DEFAULT, so no need to specify in child projects -->
    </dependency>
    <dependency>
      <groupId>betaShared</groupId>
      <artifactId>betaShared</artifactId>
      <type>bar</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
  </dependencies>
</project>

<!-- Child Proj2 -->
<project>
  <dependencies>
    <dependency>
      <groupId>charlie</groupId>
      <artifactId>charlie</artifactId>
      <type>war</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
    <dependency>
      <groupId>betaShared</groupId> 
      <artifactId>betaShared</artifactId> 
      <type>bar</type> <!-- This is not a jar dependency, so we must specify type. -->
    </dependency>
  </dependencies>
</project>



JUnit 테스트 케이스가 모든 하위 모듈에 정의되어 있고 STS 또는 Eclipse를 사용하고 있다면 Eclipse를 정의하면 테스트 케이스에 오류가 발생한다.

eclipse에서 테스트 케이스에 오류가 발생하지 않도록 부모 모듈의 junit 외부 태그에 대한 종속성을 추가해야합니다. maven은 여전히 ​​이런 종류의 태그를 가지지 않고 컴파일 될 것이지만




Eclipse에는 dependencyManagement 에 하나 더 많은 기능이 있습니다. dependencies 을 사용하지 않으면 pom 파일에서 근본적인 의존성을 발견하게됩니다. dependencyManagement 가 사용되는 경우, pom 파일에 미해결 종속성이 남아 있고 java 파일에만 오류가 나타납니다. (수입품 등 ...)




<depedencies> / <dependencyManagement> 태그와 maven의 차이점에 대한 답은 거의 없습니다.

그러나 간결한 방식으로 아래에 몇 가지 사항을 자세히 설명하지 않았습니다.

  1. <dependencyManagement> 는 서로 다른 모듈 (예 : 명확성 , 중앙 종속성 버전 관리 )에 사용되는 모든 종속성 (하위 수준에서 사용됨)을 통합 할 수 있습니다.
  2. <dependencyManagement> 사용하면 필요에 따라 종속성을 쉽게 업그레이드 / 다운 그레이드 할 수 있지만 다른 시나리오에서는 모든 하위 수준에서 일관성을 유지해야합니다
  3. <dependencies> 태그에서 제공되는 <dependencies> 은 항상 가져 오지 만 자식 pom이 해당 항목을 갖는 경우에만 상위 pom의 <dependencyManagement> 에서 제공된 <dependencyManagement> 가져옵니다



Related