最近看视频重新搭一个自用的spingcloud项目的时候,在父项目引用了新的properties和依赖之后,在子项目中使用,idea未提示异常然后在打包的时候异常,提示找不到对应的依赖的版本参数
1)概要
问题原因:子项目引入父项目的时候用了relativePath
<relativePath/> 标识依赖父项的时候直接从仓库中获取,不直接去找当前的根目录下的父pom,因为父pom新增了参数,子pom同时新增了参数并且依赖父项目参数,所以在打包的时候找不到对应的依赖所以报错了
关于relativePath 我是百度找了一个博主的,可以查看:https://download.csdn.net/blog/column/9265850/121510375
解决方式:去掉子项目依赖时候的<relativePath/>,这个是默认创建springboot项目自带的,因为一般创建springboot项目依赖的都是仓库的远程boot-parent版本
或者在父项目改pom参数后先clean install【父项目】,把本地仓库的父项目配置刷新了,然后子项目在新增pom参数clean install【子项目】也可以
2)自己问题排查记录
父项目pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.altaba</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<!-- 打包方式 -->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>order-service</module>
<module>point-service</module>
<module>gateway-service</module>
<module>user-service</module>
<module>common-module</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>2022.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0-RC1</spring-cloud-alibaba.version>
<spring-boot.version>3.0.0</spring-boot.version>
<org-apache-commons.version>3.11</org-apache-commons.version>
<hutool.version>5.8.25</hutool.version>
</properties>
<!-- dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,
并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。-->
<dependencyManagement>
<dependencies>
<!-- spring cloud依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba 依赖 -->
<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>
<!-- spring-boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
子项目pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.altaba</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath/>
</parent>
<groupId>com.altaba</groupId>
<artifactId>order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>order-service</name>
<description>order-service</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- nacos 服务注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- common 项目依赖 -->
<dependency>
<groupId>com.altaba</groupId>
<artifactId>common-module</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- aop 相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<!-- feign对应的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!-- hystrix 2020 之后无主动支持需要自引用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- mongo -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
因为父项目引用参数用的dependencyManagement,所以在父项目中引入了对应的依赖并未实际引用,只是为了约束版本,子项目只需要在引用一下就可以了
但是打包的时候提示异常,提示版本missing
2.1)怀疑是父项目依赖的时候写的有问题,检查了一下发现没有问题
2.2)怀疑是不是这个版本有问题,所以子项目没有依赖到有效的版本,检查了一下version发现有效的,并且没多带}{这种多余的符号
2.3)把父项中的依赖注释了,然后子项中加了${hutool.version},出现了新的报错,发现父项的peoperties失效了
新报错--提示必须是一个有效的版本,把${hutool.version}当成字符了,没有有效的参数识别
2.4) 把子项目中的版本直接写死成需要的版本[5.8.25]打包【只clean】,发现有效了,也就是说就是这个properties没有找到,奇怪了,明明在父项目写了啊
因为还有别的项目,然后拉了一下做了一下比对,发现子项目在依赖父项目的时候多了一个relativePath 怀疑是不是这个东西导致的啊
然后把子项目的依赖改了回去【不带version】,并且去掉了 <relativePath/>打包【clean install】成功了 很激动
可是等到再把<relativePath/>加回来的时候 二次打包【clean install 我去了,还是成功的,按理说去掉了成功,加上应该是失败的啊】
因为查了 relativePath, 想了一下可能导致的原因就是因为加了</relativePath>每次就是远程仓库找了,是不是第一次打包成功了刷新成最新的了,然后改回来也没有问题了
那么就需要控制变量法了,重新走一下自己失败的流程,之前引用的是hutool的依赖,这次新增了一个mybatis的依赖
步骤1:
依然还是加了properties以及依赖,子项目依赖只引用不写版本号,子项目引用父项目时候加上</relativePath>,然后打包【只clean】,打包失败了 !!!就是最开始出现的情况
步骤2:去掉 </relativePath>, 打包【只clean】成功了,证明此时去根pom查找
步骤3:再加上 </relativePath>, 打包【只clean】失败了,证明此时去仓库寻找
-----我敲,我想看到的场景出现了【掐会腰】
那么也就是说就是因为</relativePath> 导致的;加上</relativePath>的话-每次都直接仓库找了也不看本地项目的根pom了
并且
刚刚依赖父项目的时候先去掉 </relativePath> 打包成功【clean install】 然后加上 </relativePath> 二次打包成功【clean install】 也是成功的,就是因为打包成功之后install了 推到了本地仓库进行了刷新,所以去掉和加上都一直成功的原因
因为整个流程还是比较有趣的,对于自己找了半天,还去maven仓库看了对应项目的pom修改情况,所以记录一下