2014-10-18 87 views
1

我對maven的能力相當陌生.. 我已經看到,在放置依賴關係的pom.xml中,有時只會提到groupID和工件id,並且會跳過版本。爲什麼是這樣? 例如下面的依賴是從SpringSource的網站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.假設所有這10個項目都使用了spring-boot-starter-web。如果這10個模塊相互依賴,則可能需要在這10個模塊中使用相同版本的spring-boot-starter-web

現在想象一下,如果要在所有這些模塊中保持相同的版本號10 pom文件,然後在想要使用更新版本的spring-boot-starter-web時更新所有文件。如果能夠集中管理這些信息,這不是更好嗎?

Maven已經知道了一個<dependencyManagement/>標籤來解決這個問題,並集中了依賴信息。

對於您提供的示例,下面的一組鏈接將幫助您瞭解版本號是如何解析的,即使它並不存在於您正在查看的pom中。

看那POM的父標籤你在看(https://github.com/spring-guides/gs-authenticating-ldap/blob/master/complete/pom.xml

現在讓我們去那個家長,看看這些版本是否會在POM(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類似,可以在pom的pluginManagement部分管理插件。

希望能夠解釋它。

參見:dependencyManagementpluginManagement

2

一些補充,以優良的答案被coderplus

在多模塊項目,它被認爲是配置在項目中使用的文物一個很好的做法在根pom.xmldependencyManagement中,以便您不必在子模塊pom.xml中編寫版本(例如在您的示例中的某些依賴項中)。

聲明您用作屬性的外部庫的版本並在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中的重複聲明越多,他們就越難以擊中。尋找過時的依賴關係非常有趣。

相關問題