如何用Ant/Ivy从带授权的Gitea私有M2仓库拉取包?
解决方案:Ivy/Ant 从Gitea M2仓库拉取私有包
1. 修正Credentials的Realm配置
Gitea Maven仓库的默认Realm通常是Gitea,而非你配置的Gitea package registery(注意拼写错误:应为registry)。先确认实际Realm:
curl -I https://gitea.<org>.net/api/packages/<你的用户名/组织名>/maven
查看响应头中的WWW-Authenticate字段(例如Basic realm="Gitea"),然后修改credentials配置:
<credentials host="gitea.<org>.net" realm="Gitea" username="read_only" <!-- 可填任意用户名,Gitea令牌认证只校验密码字段 --> passwd="<你的访问令牌>" />
2. 确保Ibiblio解析器配置正确
必须开启m2compatible="true",并指向正确的Gitea Maven仓库根URL(格式为https://gitea.<org>.net/api/packages/<所有者>/maven):
<ivysettings> <settings defaultResolver="gitea-resolver" /> <resolvers> <ibiblio name="gitea-resolver" m2compatible="true" root="https://gitea.<org>.net/api/packages/<你的用户名/组织名>/maven" /> </resolvers> <!-- 上面修正后的credentials配置 --> </ivysettings>
3. 验证令牌权限
确保你的访问令牌拥有package:read权限(在Gitea的「设置-应用-访问令牌」页面检查权限列表),无此权限会返回403错误。
4. 备选:使用URL解析器替代Ibiblio
如果ibiblio解析器仍有问题,尝试用URL解析器直接指定包路径模板:
<ivysettings> <settings defaultResolver="gitea-url-resolver" /> <resolvers> <url name="gitea-url-resolver" m2compatible="true"> <ivy pattern="https://gitea.<org>.net/api/packages/<所有者>/maven/[organisation]/[module]/[revision]/[module]-[revision].ivy" /> <artifact pattern="https://gitea.<org>.net/api/packages/<所有者>/maven/[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]" /> <credentials host="gitea.<org>.net" realm="Gitea" username="read_only" passwd="<你的令牌>" /> </url> </resolvers> </ivysettings>
5. 极端方案:自定义解析器添加授权头
如果Gitea要求使用Authorization: token <令牌>而非Basic Auth,可自定义Ivy解析器扩展URLHandler:
- 编写自定义解析器类:
import org.apache.ivy.plugins.resolver.UrlResolver; import org.apache.ivy.util.url.BasicURLHandler; import org.apache.ivy.util.url.URLHandler; import java.net.HttpURLConnection; import java.net.URL; public class GiteaTokenResolver extends UrlResolver { private String authToken; public void setAuthToken(String authToken) { this.authToken = authToken; } @Override protected URLHandler getURLHandler(URL url) { return new BasicURLHandler() { @Override protected void prepareConnection(HttpURLConnection conn) throws Exception { super.prepareConnection(conn); conn.setRequestProperty("Authorization", "token " + authToken); } }; } }
- 在ivysettings.xml中配置使用:
<ivysettings> <settings defaultResolver="gitea-custom-resolver" /> <resolvers> <custom name="gitea-custom-resolver" class="com.yourcompany.GiteaTokenResolver" m2compatible="true"> <ivy pattern="https://gitea.<org>.net/api/packages/<所有者>/maven/[organisation]/[module]/[revision]/[module]-[revision].ivy" /> <artifact pattern="https://gitea.<org>.net/api/packages/<所有者>/maven/[organisation]/[module]/[revision]/[module]-[revision](-[classifier]).[ext]" /> <property name="authToken" value="<你的访问令牌>" /> </custom> </resolvers> </ivysettings>
内容的提问来源于stack exchange,提问作者jan dorresteijn
相关产品推荐
相关产品推荐

