导入别人项目或者自己搭建项目时,每次必不可少都会遇到maven报错问题 (当然有可能是别人的项目pom写的不规范 自信点可能不是你的问题 但我们需要学会解决)。 这些问题 百度都不知道怎么查,最近着手自己搭建了一个springcloud聚合工程的demo 应该算是比较有代表性了,当然 springboot也可差不多 主要是理解maven的使用, 终于把这些给理解了个大概。文章有点长 原创不易
项目结构介绍: MySpringCloud为父模块,本文以红框内的模块举例, file为业务模块 调用了user-api工具模块,user-api引入了framework工具模块,两个工具模块被common模块管理 ![在这里插入图片描述](https://img-blog.csdnimg.cn/86ab8089a4ac481688939c50273531cc.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MjY4MTAz,size_16,color_FFFFFF,t_70)
本文从多个层面分析maven综合报错问题:
首先一个比较低级的错误 一般有了开发经验不会犯 但是入门者可能会踩坑 要确保maven配置里面的maven仓库地址是可用的,典型错误:早期maven中央仓库是http传输的,后来改成了https, 网上可能还存在很多错误的mirrors配置 换句话说 仓库地址都是错误的 所以会导致所有依赖下载失败,此外 不同的仓库地址 某些依赖的groupId有可能会不同
![在这里插入图片描述](https://img-blog.csdnimg.cn/58465f5c731f4e48b8990063deec16c3.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MjY4MTAz,size_16,color_FFFFFF,t_70)
确保了地址是可用的 groupId 和 artifactId都是无误: maven遇到的主要错误 应该属以下几个 .A Cannot resolve xxxx 错误
.B Could not find artifact 错误
.C must be "pom" but is "jar"错误
.D 程序包XXX 不存在
.E Unable to find main class
解决方式:
低级错误1:找到本地maven仓库路径 查找 .lastUpdated 结尾的文件 全部删除 ,出现这种文件的情况可能由于网络不好,下载错误 并且它会阻止下次下载;低级错误2:如果网络正常 且每次下载都是这个文件,那么很可能就是依赖版本号不正确,远程仓库根本没有这个包,所以一直都是 lastUpdated 。 正文开始 用一个父子多模块maven项目 pom.xml文件实际举例 重点都在注释上面,顺便写了个英文版注释,因为xml比较容易乱码,项目几经周转很可能注释就乱了,这些注释就不复制出来了 研究这玩意 我累了。
父pom
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.4.RELEASE
pom
com.demo
MySpringCloud
0.0.1-SNAPSHOT
MySpringCloud
Demo project for Spring Boot
1.8
UTF-8
UTF-8
Hoxton.SR8
2.2.1.RELEASE
1.3.0
1.8.2
2.2.5.RELEASE
2.2.5.RELEASE
1.2.76
4.0.1
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
org.projectlombok
lombok
true
${lombok.version}
com.alibaba
fastjson
${fastjson.version}
com.alibaba.nacos
nacos-client
${nacos.version}
com.alibaba.csp
sentinel-core
${sentinel.version}
com.alibaba.csp
sentinel-transport-simple-http
${sentinel.version}
org.springframework.cloud
spring-cloud-starter-openfeign
${openfeign.version}
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
${netflix-hystrix.version}
javax.servlet
javax.servlet-api
${servlet.version}
org.apache.skywalking
apm-toolkit-trace
${skywalking.version}
org.apache.skywalking
apm-toolkit-logback-1.x
${skywalking.version}
common
user
file
子pom
4.0.0
com.demo
MySpringCloud
0.0.1-SNAPSHOT
jar
com.qkj
file
0.0.1-SNAPSHOT
file
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
org.projectlombok
lombok
true
com.alibaba
fastjson
${fastjson.version}
com.alibaba.nacos
nacos-client
com.alibaba.csp
sentinel-core
com.alibaba.csp
sentinel-transport-simple-http
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
org.apache.skywalking
apm-toolkit-trace
org.apache.skywalking
apm-toolkit-logback-1.x
com.qkj
user-api
0.0.1-SNAPSHOT
compile
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
2.3.4.RELEASE
工具类父pom :common.pom
4.0.0
com.demo
MySpringCloud
0.0.1-SNAPSHOT
pom
com.qkj
common
0.0.1-SNAPSHOT
common
Demo project for Spring Boot
1.8
file-api
user-api
framework
工具类子pom : user-api.pom
4.0.0
com.qkj
common
0.0.1-SNAPSHOT
jar
user-api
0.0.1-SNAPSHOT
user-api
1.8
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.boot
spring-boot-starter
com.qkj
framework
0.0.1-SNAPSHOT
compile
工具类子pom: framework.pom
4.0.0
com.qkj
common
0.0.1-SNAPSHOT
jar
framework
0.0.1-SNAPSHOT
framework
Demo project for Spring Boot
1.8
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.boot
spring-boot-starter
javax.servlet
javax.servlet-api
什么时候可以不写version?
父pom dependencyManagement 里面声明了version, 而子pom继承了 父pom(parent 节点声明继承关系) ,子pom依赖不声明版本,则使用父pom依赖版本,这在多子模块项目中方便管理。 而整个pom不存在parent时,version是一定要写的,如果不写则会报错
type: 默认为jar 因为我们的是聚合工程,所以父模块要声明为pom,否则会报must be “pom” but is "jar"错误
总结:
maven仓库地址有误或下载缓慢 网络不好 (推荐使用阿里仓库)版本号错误 或缺少版本号多模块项目中未正确声明父模块groupId artifactIdpom工程中 未正确声明type父模块中声明了maven打包插件 而子模块含有工具类模块
|