问题产生背景
在这个项目中,对后台使用的是spring cloud alibaba
全家桶框架,前台Vue
,持续集成这块使用Jenkins+Docker进行项目部署。
一切进展都是那么的正常……
某一天早晨,打开Jenkins,将其中一个服务进行了发版(昨晚合并的不少其他分支代码到dev环境,其中有pom文件新增加了jar包的依赖),然后Jenkins的控制台输出报错了,很多依赖的jar包提示不存在。
[ERROR] /var/jenkins_home/workspace/test/cloud-service-api/cloud-system-api/src/main/java/com/cloud/system/domain/entity/CdBom.java:[3,36] package com.alibaba.excel.annotation does not exist
[ERROR] /var/jenkins_home/workspace/test/cloud-service-api/cloud-system-api/src/main/java/com/cloud/system/domain/entity/CdBom.java:[4,36] package com.alibaba.excel.annotation does not exist
[ERROR] /var/jenkins_home/workspace/test/cloud-service-api/cloud-system-api/src/main/java/com/cloud/system/domain/entity/CdBom.java:[12,36] package tk.mybatis.mapper.annotation does not exist
[ERROR] /var/jenkins_home/workspace/test/cloud-service-api/cloud-system-api/src/main/java/com/cloud/system/domain/entity/CdBom.java:[14,25] package javax.persistence does not exist
…………
…………
[ERROR] /var/jenkins_home/workspace/test/cloud-service-api/cloud-system-api/src/main/java/com/cloud/system/domain/entity/Donate.java:[17,36] package tk.mybatis.mapper.annotation does not exist
[ERROR] /var/jenkins_home/workspace/test/cloud-service-api/cloud-system-api/src/main/java/com/cloud/system/domain/entity/SysNotice.java:[3,40] package org.apache.commons.lang3.builder does not exist
[ERROR] /var/jenkins_home/workspace/test/cloud-service-api/cloud-system-api/src/main/java/com/cloud/system/domain/entity/SysNotice.java:[4,40] package org.apache.commons.lang3.builder does not exist
解决办法
出问题,最重要的就是要看日志,看详细日志,不要放过任何一个warn、error
这里对于网上常说的几种常见的情况导致的不多说了,随便查查就出来了,主要说一下我在使用那些方法之后,依旧没有解决,最后还是靠扒拉日志解决的一个过程,可能咱俩遇到的不是同一个错误,但是解决问题的过程希望能给你带来一些帮助。
出现问题之后,不要放过日志中的任何一个【WARNING】日志!
出现问题之后,不要放过日志中的任何一个【WARNING】日志!
出现问题之后,不要放过日志中的任何一个【WARNING】日志!
希望大家后续在遇到问题时,仔细看日志,会找到原因的
-
查看maven运行日志
当maven过程中报错之后,可以添加
-X
开启debug模式,使用-e
显示maven
运行出错的信息
在尝试了网上各种方法之后,依旧没有解决问题,而且我也查看了依赖包,对应的包都在也没有损坏之后,老老实实看起来日志(虽然很长,很长)
…………………… [INFO] --------------------< com.cloud:cloud-service-api >--------------------- [INFO] Building cloud-service-api 1.1.0-SNAPSHOT [1/4] [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ cloud-service-api --- [INFO] [INFO] ---------------------< com.cloud:cloud-system-api >--------------------- [INFO] Building cloud-system-api 1.1.0-SNAPSHOT [2/4] [INFO] --------------------------------[ jar ]--------------------------------- [WARNING] The POM for com.cloud:cloud-common-core:jar:1.1.0-SNAPSHOT is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details ………………
在看到这个
WARNING
日志之后,我感觉看到了曙光……尤其是后面还有一个is invalid
如此扎眼。将Maven执行命令由
mvn clean package -pl cloud-system-api,cloud-order-api,cloud-settle-api -am
调整为
clean package -pl cloud-system-api,cloud-order-api,cloud-settle-api -am -e -X
然后
maven
的输出日志就变成了这个样子[DEBUG] ----------------------------------------------------------------------- [DEBUG] Goal: org.apache.maven.plugins:maven-jar-plugin:2.4:jar (default-jar) [DEBUG] Style: Regular [DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?> <configuration> <classesDirectory default-value="${project.build.outputDirectory}"/> <defaultManifestFile default-value="${project.build.outputDirectory}/META-INF/MANIFEST.MF"/> <finalName default-value="${project.build.finalName}">${jar.finalName}</finalName> <forceCreation default-value="false">${jar.forceCreation}</forceCreation> <outputDirectory default-value="${project.build.directory}"/> <project default-value="${project}"/> <session default-value="${session}"/> <skipIfEmpty default-value="false">${jar.skipIfEmpty}</skipIfEmpty> <useDefaultManifestFile default-value="false">${jar.useDefaultManifestFile}</useDefaultManifestFile> </configuration> [DEBUG] ======================================================================= [WARNING] The POM for com.cloud:cloud-common-core:jar:1.1.0-SNAPSHOT is invalid, transitive dependencies (if any) will not be available: 1 problem was encountered while building the effective model for com.cloud:cloud-common-core:1.1.0-SNAPSHOT [ERROR] 'dependencies.dependency.version' for com.thoughtworks.xstream:xstream:jar is missing. @
重点看最后三行,刚才的
WARNING
日志后面紧跟着一个ERROR
日志,它解释了为啥会有一个is invalid
.所以问题找到了,去
pom
文件里面找到对应的jar包,然后解决对应的问题就好了。 -
maven传递性依赖
我遇到的这个问题,隐蔽性还挺强,很容易让人根据错误信息先入为主,以为jar包没有加载上,或者jar包没下载下来等等,其实报错的包都存在,而且
pom
也没有问题从报错日志可以看出来,出现错误的
pom
并不是直接产生错误的项目,也不是提示package XXX does not exist
的包存在问题,而最终原因是maven的传递性依赖导致的。cloud-service-api--pom.xml
<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> <parent> <groupId>com.cloud</groupId> <artifactId>cloud-service-api</artifactId> <version>1.1.0-SNAPSHOT</version> </parent> <artifactId>cloud-system-api</artifactId> <dependencies> <!-- 通用工具 --> <dependency> <groupId>com.cloud</groupId> <artifactId>cloud-common-core</artifactId> <version>${cloud.version}</version> </dependency> </dependencies> </project>
在
cloud-common-core
里面将常用到的jar包进行了依赖,由于这个里面新引入了com.thoughtworks.xstream
,而由于在引入的时候,对版本号的管理出现的问题,导致cloud-common-core
的pom
文件不可用,进而导致所有依赖cloud-common-core
的项目都出现了问题不过,在idea里面运行编译竟然一点错都没报,没仔细去查为啥。。也是有点奇怪。
有任何问题欢迎关注公众号【Hugh的白板】私信我,一起探讨,一起学习