记录Jenkins突然报出大量package does not exist案发现场

2,682 阅读4分钟

问题产生背景

在这个项目中,对后台使用的是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-corepom文件不可用,进而导致所有依赖cloud-common-core的项目都出现了问题

    不过,在idea里面运行编译竟然一点错都没报,没仔细去查为啥。。也是有点奇怪。

有任何问题欢迎关注公众号【Hugh的白板】私信我,一起探讨,一起学习