2014-10-18 58 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中的重复声明越多,他们就越难以击中。寻找过时的依赖关系非常有趣。

相关问题