Azure流水线中Maven本地仓库为何报校验和验证失败错误?
Azure流水线Maven本地仓库校验和警告问题
问题背景
在Azure流水线中使用第三方JAR包,已在POM中将依赖仓库指向项目本地目录repo,POM配置如下:
<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.test</groupId> <artifactId>test</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <repositories> <repository> <id>data-local</id> <name>data</name> <url>file://${project.basedir}/repo</url> </repository> </repositories> </project>
运行流水线时出现校验和验证警告,关键日志如下:
2022-11-15 07:51:01 UTC DEBUG [main-Executable_Stream_Thread] --- [WARNING] Checksum validation failed, no checksums available from data-local for file:///home/vsts/work/1/s/repo/com/streamserve/jstrscas/16.6.2_GA_327/jstrscas-16.6.2_GA_327.pom 2022-11-15 07:51:01 UTC DEBUG [main-Executable_Stream_Thread] --- Downloaded from data-local: file:///home/vsts/work/1/s/repo/com/streamserve/jstrscas/16.6.2_GA_327/jstrscas-16.6.2_GA_327.pom (410 B at 22 kB/s)
已执行mvn clean install -DcreateChecksum=true将测试项目安装到本地Maven仓库,但警告仍然存在。
原因分析
- 你执行的
mvn clean install -DcreateChecksum=true仅针对当前测试项目,会把测试项目的构件安装到默认本地仓库(~/.m2/repository),但流水线依赖的是项目目录下repo文件夹里的第三方JAR包,这个目录中的包并没有生成对应的校验和文件(.md5、.sha1等)。 - Maven校验和验证逻辑是:当从仓库拉取构件时,会尝试读取该构件对应的校验和文件来验证完整性,如果找不到这些文件,就会抛出
Checksum validation failed警告。
解决办法
方法1:手动为第三方包生成校验和
进入项目本地仓库中第三方包所在的目录(比如repo/com/streamserve/jstrscas/16.6.2_GA_327/),执行以下命令生成MD5和SHA1校验和文件:
# 为pom文件生成校验和 md5sum jstrscas-16.6.2_GA_327.pom > jstrscas-16.6.2_GA_327.pom.md5 sha1sum jstrscas-16.6.2_GA_327.pom > jstrscas-16.6.2_GA_327.pom.sha1 # 为JAR文件生成校验和 md5sum jstrscas-16.6.2_GA_327.jar > jstrscas-16.6.2_GA_327.jar.md5 sha1sum jstrscas-16.6.2_GA_327.jar > jstrscas-16.6.2_GA_327.jar.sha1
生成后将这些校验和文件和包文件一起提交到代码仓库,流水线拉取后就能正常验证。
方法2:用Maven命令将第三方包安装到指定仓库并生成校验和
如果第三方JAR是本地文件,执行以下命令(替换占位符为实际路径和构件信息),直接将包安装到项目的repo目录并自动生成校验和:
mvn install:install-file \ -Dfile=/path/to/your/jstrscas-16.6.2_GA_327.jar \ -DgroupId=com.streamserve \ -DartifactId=jstrscas \ -Dversion=16.6.2_GA_327 \ -Dpackaging=jar \ -DlocalRepositoryPath=${project.basedir}/repo \ -DcreateChecksum=true
执行完成后,repo目录下会自动生成包含校验和文件的构件目录,提交到代码仓库即可。
方法3:确认流水线检出完整目录
在Azure流水线的代码拉取任务中,确保repo目录被完整检出到构建代理的工作目录中,避免校验和文件因目录缺失而无法被Maven读取。
内容的提问来源于stack exchange,提问作者Bharath Kumar
相关产品推荐
相关产品推荐

