为什么有时会跳过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.xml
的dependencyManagement
中配置项目使用的工件被认为是一种很好的做法,这样您就不必在子模块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中的冗余声明越多,它们就越难以击中。 寻找过时的依赖是非常有趣的。
- NoClassDefFoundError:javax / inject / Provider和ClassNotFoundException:javax.inject.Provider
- 将@Context UriInfo解析为java线程