使用Apache Ivy/Spark从GitLab包仓库拉取构件时遇未授权问题
问题描述
我已经把一个Jar包部署到GitLab Package Registry,现在想把它加入Spark应用,但始终无法通过这个受密码保护的仓库的授权验证。我试过配置spark.jars.packages和spark.jars.repositories,哪怕硬编码token也没法正常授权,但复制拉取pom/jar的URL直接用curl却能正常访问。
为了找解决方案,我编写了如下Ivy配置:
<ivysettings> <settings defaultResolver="default" /> <credentials host="private.git.domain.com" username="read_only" passwd="<TOKEN>"/> <resolvers> <ibiblio name="maven2" m2compatible="true" /> <ibiblio name="gitlab" m2compatible="true" root="https://private.git.domain.com/api/v4/projects/<ID>/packages/maven" /> <chain name="default"> <resolver ref="maven2" /> <resolver ref="gitlab" /> </chain> </resolvers> </ivysettings>
但仍持续收到HTTP响应状态401 CLIENT ERROR: Unauthorized错误,似乎未能正确添加凭证,当前realm自动设置为GitLab Packages Registry。有没有人成功实现过该操作?
解决方案
- 给Ivy凭证指定匹配的Realm
GitLab Packages Registry的Realm固定为GitLab Packages Registry,你的配置中未指定Realm,导致凭证无法和仓库的认证域匹配。修改credentials标签,添加realm属性:
<credentials host="private.git.domain.com" realm="GitLab Packages Registry" username="read_only" passwd="<TOKEN>"/>
验证GitLab Token的权限
确保你的GitLab Token拥有read_api和read_repository权限(针对项目级包仓库);如果是组级仓库,还需要对应组的读取权限。确保Spark加载正确的Ivy配置
启动Spark应用时,通过JVM参数指定Ivy配置文件路径:
spark-submit \ -Divy.settings.path=/绝对路径/to/your/ivysettings.xml \ --conf spark.jars.packages=com.your.group:your-artifact:version \ your-spark-app.jar
或者将配置文件放在默认路径~/.ivy2/ivysettings.xml,Spark会自动加载。
- 备选:URL嵌入凭证直接访问
如果Ivy配置方案仍不生效,可以直接在仓库地址中嵌入凭证(注意特殊字符需URL编码):
spark-submit \ --conf spark.jars.repositories=https://read_only:<URL编码后的TOKEN>@private.git.domain.com/api/v4/projects/<ID>/packages/maven \ --conf spark.jars.packages=com.your.group:your-artifact:version \ your-spark-app.jar
内容的提问来源于stack exchange,提问作者matszewczyk
相关产品推荐
相关产品推荐

