GitLab流水线运行报Could not find or load main class错误如何解决?
1. 自定义Maven本地仓库路径报错的原因与解决方法
报错原因
你的CI_PROJECT_DIR路径D:\Java Testing\GitLab-Runner\...中存在空格,而你定义的MAVEN_OPTS参数没有做引号包裹处理,Windows Shell执行命令时会按空格将参数拆分:
展开后的参数-Dmaven.repo.local=D:\Java Testing\GitLab-Runner\...\.m2\repository会被拆为两部分:-Dmaven.repo.local=D:\Java和Testing\GitLab-Runner\...\.m2\repository,JVM会把第二部分识别为要启动的主类名,因此抛出找不到主类的错误。
提示:
No URL provided, cache will not be downloaded from shared cache server属于正常提示,仅说明你未配置分布式共享缓存服务,当前使用Runner本地缓存,不影响构建功能。
解决方法
你可以任选以下一种方案修复:
- 方案1:执行mvn命令时给变量包裹双引号,避免空格拆分。将script段中的
mvn $MAVEN_OPTS clean test修改为:- Cmd环境:
mvn "%MAVEN_OPTS%" clean test - PowerShell环境:
mvn "$MAVEN_OPTS" clean test
- Cmd环境:
- 方案2:定义
MAVEN_OPTS变量时自带引号,修改variables段配置:variables: MAVEN_OPTS: "-D\"maven.repo.local=$CI_PROJECT_DIR/.m2/repository\"" - 方案3:修改GitLab Runner的工作根目录,确保路径中不存在空格,从根源规避参数拆分问题。
2. 默认依赖下载到System32目录的原因
你使用的是Windows系统的Shell类型GitLab Runner,默认情况下GitLab Runner服务是以**本地系统账户(Local System)**运行的,该账户的默认用户家目录就是C:\Windows\System32\config\systemprofile\,而Maven默认的本地仓库路径为${user.home}/.m2/repository,因此依赖会默认下载到该路径下。
如果需要修改默认路径,你可以将GitLab Runner服务的运行账户修改为普通Windows用户,就会自动切换到对应用户家目录下的.m2路径作为默认仓库位置。
内容的提问来源于stack exchange,提问作者Sandesh Sawant

