Jenkins执行maven-cucumber-reporting报错缺失ArrayUtils类问题
这个问题和你项目里声明的commons-lang3依赖没关系——Maven插件运行时用独立的类加载器(就是报错里的plugin realm),默认只加载插件自身的依赖,不会读取项目<dependencies>下声明的包,你在项目里配的commons-lang3是给测试代码用的,插件根本访问不到。
看报错里打印的插件类路径就很清楚:插件运行时只加载了3个jar,完全没有commons-lang3,所以才会抛org.apache.commons.lang3.ArrayUtils找不到的错误。
本地能跑通是因为你本地用Maven 3.8.3,联网状态下会自动拉取插件缺失的传递依赖;Jenkins是离线环境,你之前同步依赖的时候大概率只同步了项目代码需要的依赖,漏了maven-cucumber-reporting插件自身的传递依赖,再加上Jenkins装的Maven 3.3.9是2015年的老版本,本身和你用的高版本构建插件、测试组件存在兼容问题,才会出现本地正常、Jenkins报错的差异。
- 先查Jenkins上Maven仓库里
org/apache/commons/commons-lang3/路径下的jar包是否完整,有没有损坏、大小为0、校验和不匹配的问题。 - 查
net/masterthought/maven-cucumber-reporting/5.7.0/目录下的pom文件,确认它声明的commons-lang3依赖版本,再去仓库对应路径检查包是否存在。 - 确认你之前同步依赖的时候,有没有过滤掉插件目录(比如
org/apache/maven、net/masterthought这类路径)的文件,很多人同步离线仓库只会同步项目依赖的普通jar,漏了构建插件的传递依赖。
最快修复方案
直接在maven-cucumber-reporting插件的配置里,显式把commons-lang3声明为插件的依赖,强制插件运行时加载这个包:
<plugin> <groupId>net.masterthought</groupId> <artifactId>maven-cucumber-reporting</artifactId> <version>${maven-cucumber-reporting.version}</version> <!-- 显式添加插件运行需要的依赖 --> <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> </dependencies> <executions> <!-- 原有execution配置保持不变即可 --> <execution> <id>generate-cucumber-reports</id> <phase>verify</phase> <goals> <goal>generate</goal> </goals> <configuration> <projectName>Automation report</projectName> <outputDirectory>${project.build.directory}/cucumber-reports</outputDirectory> <inputDirectory>${project.build.directory}/</inputDirectory> <jsonFiles> <param>**/*.json</param> </jsonFiles> <checkBuildResult>false</checkBuildResult> </configuration> </execution> </executions> </plugin>
确认Jenkins仓库里对应版本的commons-lang3包存在,重新构建就能过。
离线环境根治方案
把你本地能正常跑通构建的整个.m2/repository目录全量同步到Jenkins服务器,不要做任何路径过滤,尤其是构建插件相关的目录必须完整同步,不要只传项目依赖的普通jar。
版本兼容优化
把Jenkins上的Maven从3.3.9升级到和本地一致的3.8.x版本,避免因为Maven核心版本过老和新插件出现兼容问题,也能减少本地和CI环境版本差异导致的不一致问题。
不用反复换项目里声明的commons-lang3版本,项目依赖和插件的类加载器是隔离的,改项目依赖版本根本影响不到插件运行时的类路径,纯做无用功。
内容的提问来源于stack exchange,提问作者Thomarkey

