pom.xml 메이븐 사용법 - 종속성 관리와 Maven의 종속성 간의 차이점





4 Answers

나는이 질문에 유행에 뒤늦지 만 받아 들인 답보다 명확한 답변을 할 가치가 있다고 생각한다. (맞지만 실제 중요한 부분을 강조하지는 않는다.

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

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

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

레파지토리 goal 종류

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>



종속성이 최상위 레벨의 dependencyManagement 요소에 정의 된 경우, 하위 프로젝트는 종속성의 버전을 명시 적으로 나열 할 필요가 없습니다. 하위 프로젝트가 버전을 정의한 경우 최상위 POM의 dependencyManagement 섹션에 나열된 버전보다 우선합니다. 즉, dependencyManagement 버전은 자식이 버전을 직접 선언하지 않을 때만 사용됩니다.




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

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

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




Related