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

时间:2014-10-18 15:28:57

标签: java maven dependencies pom.xml

我对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的其他地方也提到版本不是可选的。如果有人能解释一下,我会很高兴。

2 个答案:

答案 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部分中管理插件。

希望能够解释它。

参考:dependencyManagementpluginManagement

答案 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>

here

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