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

如何在Java程序中调用Maven实现密码加密?

在Java程序中实现Maven密码加密功能(模拟mvn --encrypt-password)

你完全不需要借助Maven Invoker或者调用命令行,直接使用Maven核心的settings-security模块就能实现这个功能——这也是mvn --encrypt-password命令底层依赖的实现逻辑,完全平台无关。

步骤1:引入必要的Maven依赖

首先需要在你的项目中添加以下依赖(如果是Maven项目的话):

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-settings</artifactId>
        <version>3.9.6</version> <!-- 建议使用最新稳定版 -->
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-settings-security</artifactId>
        <version>3.2.0</version> <!-- 与maven-settings版本保持兼容 -->
    </dependency>
    <dependency>
        <groupId>org.codehaus.plexus</groupId>
        <artifactId>plexus-component-annotations</artifactId>
        <version>2.1.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

步骤2:编写Java代码实现加密

下面的代码会完全模拟mvn --encrypt-password p4ssw0rd的行为:包括自动读取用户目录下的settings-security.xml,如果不存在则自动生成随机的master密码并保存,然后用它来加密目标密码。

import org.apache.maven.settings.SecuritySettings;
import org.apache.maven.settings.crypto.DefaultSettingsDecrypter;
import org.apache.maven.settings.crypto.DefaultSettingsDecrypterFactory;
import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
import org.apache.maven.settings.crypto.SettingsDecrypter;
import org.apache.maven.settings.crypto.SettingsDecryptionRequest;
import org.apache.maven.settings.crypto.SettingsDecryptionResult;
import org.apache.maven.settings.security.DefaultSecuritySettingsBuilder;
import org.apache.maven.settings.security.SecuritySettingsBuilder;
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;

import java.io.File;

public class MavenPasswordEncryptor {

    public static String encryptPassword(String plainPassword) throws Exception {
        // 1. 加载或自动创建settings-security.xml
        SecuritySettingsBuilder securityBuilder = new DefaultSecuritySettingsBuilder();
        File securityFile = new File(System.getProperty("user.home"), ".m2/settings-security.xml");
        
        SecuritySettings securitySettings;
        if (!securityFile.exists()) {
            // 无配置文件时,生成默认master密码并保存(和Maven命令行逻辑一致)
            securitySettings = securityBuilder.buildDefaultSettings();
            securityBuilder.saveSettings(securityFile, securitySettings);
        } else {
            securitySettings = securityBuilder.buildSettings(securityFile);
        }

        // 2. 初始化Maven组件容器
        PlexusContainer container = new DefaultPlexusContainer();
        DefaultSettingsDecrypterFactory decrypterFactory = container.lookup(DefaultSettingsDecrypterFactory.class);
        
        // 3. 创建加密器实例
        SettingsDecrypter decrypter = decrypterFactory.newInstance(securitySettings);
        
        // 4. 构造加密请求(API命名反直觉:decrypt方法实际可处理加密)
        SettingsDecryptionRequest request = new DefaultSettingsDecryptionRequest();
        request.setPassword(plainPassword);
        
        SettingsDecryptionResult result = decrypter.decrypt(request);
        
        // 5. 返回加密后的密码
        return result.getPassword();
    }

    public static void main(String[] args) {
        try {
            String encryptedPwd = encryptPassword("p4ssw0rd");
            System.out.println("加密后的密码:" + encryptedPwd);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

关键说明

  • 为什么不用Maven Invoker?:Invoker的定位是触发Maven构建任务(比如mvn clean install),它并没有直接暴露加密密码的API。直接调用Maven的settings-security模块,是最直接高效的方式,完全满足平台无关的要求。
  • API的反直觉设计:代码中调用的是decrypt方法,但实际实现了加密——这是因为Maven将加密/解密逻辑封装在同一个组件中,当传入明文密码时,它会自动使用master密码完成加密操作。
  • master密码的自定义:如果不想使用自动生成的master密码,你可以手动创建settings-security.xml并配置自定义的master密码,代码会自动读取该配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:43:40