今天遇到一个很扯淡的问题,记录一下。
之所以说扯淡,是因为这是粗心大意导致的,之所以要记录,是因为我发现这种问题大部分人都会遇到,但由于对maven打包方式及pom文件的理解缺失,导致大部分人会绕过这个问题。
问题描述:
新建了父子级的maven项目,父项目由idea的ali spring initialer自动创建,我新建了子maven moudule,在子moudule中添加依赖时,如果不指定具体version,则报错,提示'dependencies.dependency.version' for xxx:jar is missing。
思路:
这个问题表面上看很好解决,直接加version就完了呗。
但我看了一下另一个项目,不加版本号是没问题的,而且我记得我以前写项目,不指定version也是没问题的,所以还是配置有问题。
key point在父项目和子项目的pom配置上。
发现原因:
父项目的pom中指定了dependencyManagement标签
这个标签很重要,这里涉及一个概念,此标签的用处及与dependency的区别。
dependencymanagement的作用在于声明依赖,但其并不引用。只是表示了一个抽象,你可以做哪些事,但你还没有做。
dependency表示引入了某个依赖,一个或duogejar,可以在其中忽略具体的版本,因为他会从dependencymanagement中获取他应该有的版本。
那么,此时,重点来了:
dependencymanagement不是加上就可以,他也分很多种类。比如在我的项目中,涉及到了spring boot、ali cloud、spring cloud,那么就需要这样写:
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
我的问题在于,我想引入的gateway是springcloud的功能,但我在父项目的dependencyManagement中没有声明springcloud及其版本,所以在子项目中,如果对依赖不加入version的话,就会提示version is missing。
解决办法:
父项目中加入对应依赖的management引入声明。
需解决的问题:
dependencyManagement中各个参数的了解。比如type,scope等等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。