我对maven的能力相当新。 我已经看到在pom.xml中放置依赖项,有时只提及groupID和artifact ID,并跳过版本。为什么是这样? 例如,以下依赖项来自Springsource网站http://spring.io/guides/gs/authenticating-ldap/
<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>
但是在stackoverflow的其他地方也提到版本不是可选的。如果有人能解释一下,我会很高兴。
答案 0 :(得分:4)
是的,版本不是可选的。
考虑一个多模块应用程序,它有10个模块,比如module1,module2 .. module10。假设所有这10个项目都使用spring-boot-starter-web
。如果这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部分中管理插件。
希望能够解释它。
答案 1 :(得分:2)
coderplus
的优秀答案的一些补充:
在多模块项目中,在根dependencyManagement
的{{1}}中配置项目使用的工件被认为是一种很好的做法,这样您就不会有在子模块pom.xml
中编写版本(如示例中的某些依赖项)。
声明用作属性的外部库的版本,然后在pom.xml
中使用这些属性也被认为是一种很好的做法。这或多或少地完成了here:
dependencyManagement/dependencies/dependency/version
在多模块项目中,您还应该在<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>
中声明自己的工件。
但请不要明确写出版本(就像Spring人做here),而是使用dependencyManagement
。
所以最好写一下:
${project.version}
而不是
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>${project.version}</version>
</dependency>
整个目的是DRY,不要重复自己。您在POM中的冗余声明越多,它们就越难以击中。寻找过时的依赖是非常有趣的。