You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Maven自动获取并使用AWS CodeArtifact临时访问令牌

自动配置Maven使用AWS CodeArtifact临时令牌的方案

针对你遇到的AWS CodeArtifact令牌自动注入问题,结合给定的限制条件,提供两个可行方案:


方案一:Maven核心扩展(推荐,完全无前置操作)

原理

Maven核心扩展会在Maven生命周期启动前加载运行,能在仓库元数据下载前动态修改settings.xml中的服务器密码,完美避开「Maven提前下载元数据导致插件无效」的问题。

实现步骤

  1. 编写一个简单的Java类,实现Maven的AbstractMavenLifecycleParticipant接口,在Maven会话启动后自动调用AWS SDK获取令牌并更新settings:
import org.apache.maven.AbstractMavenLifecycleParticipant;
import org.apache.maven.MavenExecutionException;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.component.annotations.Component;
import software.amazon.awssdk.services.codeartifact.CodeartifactClient;
import software.amazon.awssdk.services.codeartifact.model.GetAuthorizationTokenRequest;

@Component(role = AbstractMavenLifecycleParticipant.class)
public class CodeArtifactTokenExtension extends AbstractMavenLifecycleParticipant {

    @Override
    public void afterSessionStart(org.apache.maven.execution.MavenSession session) throws MavenExecutionException {
        Settings settings = session.getSettings();
        // 替换为你在settings.xml中定义的CodeArtifact服务器ID
        Server codeArtifactServer = settings.getServer("codeartifact-maven-repo");
        if (codeArtifactServer != null) {
            try (CodeartifactClient client = CodeartifactClient.create()) {
                GetAuthorizationTokenRequest tokenRequest = GetAuthorizationTokenRequest.builder()
                        .domain("your-codeartifact-domain") // 替换为你的CodeArtifact域名
                        .domainOwner("your-aws-account-id") // 替换为你的AWS账号ID
                        .build();
                String tempToken = client.getAuthorizationToken().authorizationToken();
                codeArtifactServer.setPassword(tempToken);
            } catch (Exception e) {
                throw new MavenExecutionException("Failed to fetch CodeArtifact authorization token", e);
            }
        }
    }
}
  1. 将这个类打包成Jar包,同时包含AWS CodeArtifact SDK依赖(software.amazon.awssdk:codeartifact)。
  2. 将Jar包放到以下目录之一:
    • 全局生效:~/.mvn/extensions(所有Maven项目都能使用)
    • 项目级生效:项目根目录下的.mvn/extensions(仅当前项目生效)
  3. 在settings.xml中配置CodeArtifact服务器(无需填写密码):
<server>
  <id>codeartifact-maven-repo</id>
  <username>aws</username>
  <!-- 密码会由扩展自动填充 -->
</server>

优势

  • 完全自动:开发者只需正常执行mvn install,无需任何前置脚本或IDE配置
  • 符合所有限制:密码不在POM中,不依赖项目属性,避开了插件的局限性

方案二:脚本包装器(无需编写Java代码)

原理

通过一个简单的脚本,在启动Maven前先获取CodeArtifact令牌,再将令牌作为系统属性传递给Maven,避开Windowssetx无法影响当前进程的问题。

实现步骤

  1. 创建脚本文件:
    • Windows(mvn-codeartifact.bat):
@echo off
:: 获取CodeArtifact令牌,替换为你的域名和账号ID
for /f "delims=" %%i in ('aws codeartifact get-authorization-token --domain your-domain --domain-owner your-account-id --query authorizationToken --output text') do set CODEARTIFACT_TOKEN=%%i
:: 传递令牌给Maven,执行用户输入的所有参数
mvn %* -Dcodeartifact.token=%CODEARTIFACT_TOKEN%
  • Linux/macOS(mvn-codeartifact.sh):
#!/bin/bash
CODEARTIFACT_TOKEN=$(aws codeartifact get-authorization-token --domain your-domain --domain-owner your-account-id --query authorizationToken --output text)
mvn "$@" -Dcodeartifact.token=$CODEARTIFACT_TOKEN
  1. 在settings.xml中配置服务器,使用系统属性填充密码:
<server>
  <id>codeartifact-maven-repo</id>
  <username>aws</username>
  <password>${codeartifact.token}</password>
</server>
  1. 开发者只需运行这个脚本代替直接执行mvn命令(比如用./mvn-codeartifact.sh install代替mvn install),IDE中可将Maven命令路径指向该脚本。

优势

  • 无需编写Java代码,实现成本低
  • 完全符合限制条件:密码不在POM中,使用系统属性而非项目属性

对限制条件的适配说明

  1. 仓库密码不在POM中:两个方案均通过settings.xml或扩展动态设置密码,完全不涉及POM
  2. settings.xml不使用项目属性:方案一直接修改settings对象,方案二使用系统属性,均符合要求
  3. exec-maven-plugin的Windows限制:方案一无需exec插件,方案二用前置脚本避开了exec无法修改父进程环境变量的问题
  4. properties-maven-plugin的局限性:两个方案均不依赖该插件
  5. surefire插件fork JVM:令牌在Maven启动时已完成注入,fork的JVM无需额外处理
  6. Windows setx的问题:方案二使用for /f在当前进程直接设置变量,解决了setx不影响当前进程的问题
  7. Maven提前下载元数据:方案一的扩展在会话启动后立即运行,早于元数据下载;方案二在Maven启动前已获取令牌,均满足要求

内容的提问来源于stack exchange,提问作者Steve Mitchell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:35:23