2014-10-18 2 views
1

나는 maven의 능력에 상당히 새로운 편이다. 종속성이있는 pom.xml에서 groupID와 이슈 ID 만 언급되고 버전은 건너 뛴다는 것을 보았다. 왜 이런거야? 예를 들어 아래의 의존성은 스프링 소스 웹 사이트에서 http://spring.io/guides/gs/authenticating-ldap/왜 maven 의존성의 버전 번호가 때때로 건너 뛰는가?

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-ldap</artifactId> 
     <version>3.2.4.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.directory.server</groupId> 
     <artifactId>apacheds-server-jndi</artifactId> 
     <version>1.5.5</version> 
    </dependency> 
</dependencies> 

이다 그러나 다른 곳에서 유래에서 또한 해당 버전은 선택되지 않습니다 언급했다. 누군가가 이것을 설명 할 수 있다면 기쁠 것입니다.

답변

2

예, 버전은 선택 사항이 아닙니다.

10 개의 모듈, 예를 들어 module1, module2 .. module10.Assume이 10 개 프로젝트 모두에 spring-boot-starter-web을 사용하는 멀티 모듈 응용 프로그램을 생각해보십시오. 이 10 개의 모듈이 상호 의존적 인 경우이 각각의 버전에서 spring-boot-starter-web의 동일한 버전을 사용하는 것이 좋습니다.

이제는이 모든 버전에서 동일한 버전 번호를 유지하는 것이 얼마나 복잡한 지 상상해보십시오. 10 pom 파일을 다운로드 한 다음 spring-boot-starter-web의 최신 버전을 사용하려면이 파일을 모두 업데이트하십시오. 이 정보를 중앙에서 관리 할 수 ​​있다면 더 좋지 않을까요?

Maven에는이 문제를 해결하고 종속성 정보를 중앙 집중화하기 위해 <dependencyManagement/> 태그가 있습니다.

제공된 예제의 경우, 아래 링크 세트는 사용자가보고있는 pom에없는 경우에도 버전 번호가 어떻게 해석되는지 이해하는 데 도움이됩니다. 당신이 (https://github.com/spring-guides/gs-authenticating-ldap/blob/master/complete/pom.xml)

보고있는 치어의 부모 태그에서

봐 지금 그 부모로 이동하여 버전이 치어 (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-starters/spring-boot-starter-parent/pom.xml)의 dependencyManagement 섹션에 지정된 경우 볼 수 있습니다. 아니 거기에 정의되어 있지 않습니다. 이제 부모의 부모를 봅시다. https://github.com/spring-projects/spring-boot/blob/master/spring-boot-dependencies/pom.xml. 오오, 우리는 거기에 버전 번호를 가지고 있습니다.

dependencyManagement와 마찬가지로, plugin의 pluginManagement 섹션에서 플러그인을 관리 할 수 ​​있습니다.

희망 사항.

를 참조하십시오 dependencyManagement,

2

우수한 대답에 몇 가지 추가 pluginManagementcoderplus 기준 : 멀티 모듈 프로젝트에서

, 프로젝트에 의해 사용 된 아티팩트를 구성하는 것이 좋습니다로 간주됩니다 자식 모듈 pom.xml (예제의 일부 종속성 에서처럼)에 버전을 쓸 필요가 없도록 pom.xml 루트의 dependencyManagement에 있습니다.

또한 속성으로 사용하는 외부 라이브러리의 버전을 선언하고 dependencyManagement/dependencies/dependency/version에서 이러한 속성을 사용하는 것이 좋습니다. 이것은 더 많거나 적은 here를 수행됩니다

<properties> 
    <logback.version>1.1.2</logback.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>${logback.version}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

을 멀티 모듈 프로젝트, 당신은 또한 dependencyManagement에 자신의 유물을 선언해야합니다.

그러나 스프링 사용자가 수행하는 것처럼 here과 같이 버전을 명시 적으로 쓰지 말고 ${project.version}을 사용하십시오.

그래서 쓰기 더 좋았을 것 :

 <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot</artifactId> 
      <version>${project.version}</version> 
     </dependency> 

대신

 <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot</artifactId> 
      <version>1.2.0.BUILD-SNAPSHOT</version> 
     </dependency> 

here

의.

전체 목적은 DRY이며, 반복하지 마십시오. POM에 대한 중복 선언이 많을수록 더 많이 공격 할 수 있습니다. 구식 의존성에 대한 사냥은 너무 재미 있습니다.

관련 문제