为什么有时会跳过maven依赖项中的版本号?

我对maven的function相当新。我已经看到在pom.xml中放置了依赖项,有时只提到groupID和artifact id并且跳过了版本。 为什么是这样? 例如,以下依赖项来自Springsource网站http://spring.io/guides/gs/authenticating-ldap/

  org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-security   org.springframework.security spring-security-ldap 3.2.4.RELEASE   org.apache.directory.server apacheds-server-jndi 1.5.5   

但是在stackoverflow的其他地方,还提到版本不是可选的。 如果有人能够解释这一点我会很高兴。

是的,版本不是可选的。

考虑一个多模块应用程序,它有10个模块,比如module1,module2 .. module10。假设所有这10个项目都使用spring-boot-starter-web 。 如果这10个模块是相互依赖的,您可能希望在这10个模块中使用相同版本的spring-boot-starter-web

现在想象一下,如果要在所有这10个pom文件中保持相同的版本号,然后在想要使用更新版本的spring-boot-starter-web时更新所有这些文件,会有多复杂。 如果能够集中管理这些信息会不会更好?

Maven已经知道一个标记来解决这个问题并集中依赖信息。

对于您提供的示例,下面的链接集将帮助您了解如何解析版本号,即使它在您正在查看的pom中不存在。

查看您正在查看的pom的父标记( https://github.com/spring-guides/gs-authenticating-ldap/blob/master/complete/pom.xml

现在让我们转到那个父节点,看看是否在该pom的dependencyManagement部分中指定了版本( https://github.com/spring-projects/spring-boot/blob/master/spring-boot-starters/spring-boot -starter-parent / pom.xml )。 不,它也没有在那里定义。 现在让我们看看父级的父级。 https://github.com/spring-projects/spring-boot/blob/master/spring-boot-dependencies/pom.xml 。 哦,是的,我们有那里的版本号。

与dependencyManagement类似,可以在pom的pluginManagement部分中管理插件。

希望能够解释它。

参考: dependencyManagement , pluginManagement

coderplus的优秀答案的一些coderplus

在多模块项目中,在root pom.xmldependencyManagement中配置项目使用的工件被认为是一种很好的做法,这样您就不必在子模块pom.xml编写版本(比如你的例子中的某些依赖项)。

声明用作属性的外部库的版本,然后在dependencyManagement/dependencies/dependency/version使用这些属性也被认为是一种很好的做法。 这或多或少在这里完成:

  1.1.2     ch.qos.logback logback-classic ${logback.version}    

在多模块项目中,您还应该在dependencyManagement声明自己的工件。

但是请不要明确地编写版本(就像Spring在这里做的那样),而是使用${project.version}

所以最好写一下:

   org.springframework.boot spring-boot ${project.version}  

代替

   org.springframework.boot spring-boot 1.2.0.BUILD-SNAPSHOT  

在这里 。

整个目的是干 ,不要重复自己。 您在POM中的冗余声明越多,它们就越难以击中。 寻找过时的依赖是非常有趣的。