Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么maven依赖项中的版本号有时会被跳过?_Java_Maven_Dependencies_Pom.xml - Fatal编程技术网

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

Java 为什么maven依赖项中的版本号有时会被跳过?,java,maven,dependencies,pom.xml,Java,Maven,Dependencies,Pom.xml,我对maven的能力还比较陌生。。 我在pom.xml中看到,在放置依赖项的地方,有时只提到groupID和工件id,而跳过版本。为什么会这样? 例如,下面的依赖项来自springsource网站 org.springframework.boot SpringBootStarterWeb org.springframework.boot 弹簧启动安全 org.springframework.security spring安全ldap 3.2.4.1发布 org.apache.directory

我对maven的能力还比较陌生。。 我在pom.xml中看到,在放置依赖项的地方,有时只提到groupID和工件id,而跳过版本。为什么会这样? 例如,下面的依赖项来自springsource网站


org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧启动安全
org.springframework.security
spring安全ldap
3.2.4.1发布
org.apache.directory.server
apacheds服务器jndi
1.5.5

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

是的,版本不是可选的

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

现在想象一下,如果您要在所有这10个pom文件中保持相同的版本号,然后在您想要使用较新版本的
spring boot starter web
时更新所有文件,这将是多么复杂。如果可以集中管理这些信息不是更好吗

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

对于您提供的示例,下面的一组链接将帮助您了解如何解析版本号,即使您正在查看的pom中没有版本号

查看您正在查看的pom的父标记()

现在让我们转到该父级,看看是否在该pom()的dependencyManagement部分中指定了版本。不,这里也没有定义。现在让我们看一下家长的家长。哦,是的,我们有版本号

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

希望这能解释这一点


请参阅:,
coderplus对优秀答案的几点补充:

在多模块项目中,在根
pom.xml
dependencyManagement
中配置项目使用的工件被认为是一种良好的做法,这样您就不必在子模块
pom.xml
中编写版本(就像您示例中的某些依赖项)

声明用作属性的外部库的版本,然后在
dependencyManagement/dependencies/dependency/version
中使用这些属性,这也是一种良好的做法。这或多或少是这样做的:

而不是

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>1.2.0.BUILD-SNAPSHOT</version>
        </dependency>

org.springframework.boot

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

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