我想使用 Maven 的密码加密,例如它用于 Mojo 属性的节点。我尝试将加密密码粘贴到 mojo 的正确属性中,但它会将其视为纯文本。我希望我可以在 Mojo 属性的注释上设置一个属性来解释它可以被加密,如果是这样,使用系统主密码来解密,但我在文档中看不到任何内容那。
有没有人设法将 Maven 的密码加密用于服务器密码节点以外的任何东西?很想为我的 Mojo 做这项工作。
我想使用 Maven 的密码加密,例如它用于 Mojo 属性的节点。我尝试将加密密码粘贴到 mojo 的正确属性中,但它会将其视为纯文本。我希望我可以在 Mojo 属性的注释上设置一个属性来解释它可以被加密,如果是这样,使用系统主密码来解密,但我在文档中看不到任何内容那。
有没有人设法将 Maven 的密码加密用于服务器密码节点以外的任何东西?很想为我的 Mojo 做这项工作。
不是一个完整的答案,但希望指向正确的方向......
maven-scm-plugin、maven-release-plugin和tomcat6-maven-plugin都允许从文件的<servers>
部分读取密码${user.home}/.m2/settings.xml
。
也许如果您查看这些插件/目标的源代码,您会发现一个 Maven 核心或共享组件,它允许您做您想做的事情,并且您可以根据需要对其进行调整。
@user944849 让我朝着正确的方向开始,这就是解决方案。
如果您使用的是 Maven 2,则需要将以下依赖项添加到您的 mojo:
<dependency>
<groupId>org.sonatype.plexus</groupId>
<artifactId>plexus-sec-dispatcher</artifactId>
<version>1.4</version>
<scope>compile</scope>
</dependency>
并将以下内容放入src/main/resources/META-INF/plexus/components.xml
:
<?xml version="1.0" encoding="utf-8" ?>
<component-set>
<components>
<component>
<role>org.sonatype.plexus.components.sec.dispatcher.SecDispatcher</role>
<role-hint>mng-4384</role-hint>
<implementation>org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher</implementation>
<requirements>
<requirement>
<role>org.sonatype.plexus.components.cipher.PlexusCipher</role>
<role-hint>mng-4384</role-hint>
<field-name>_cipher</field-name>
</requirement>
</requirements>
<configuration>
<_configuration-file>~/.m2/settings-security.xml</_configuration-file>
</configuration>
</component>
<component>
<role>org.sonatype.plexus.components.cipher.PlexusCipher</role>
<role-hint>mng-4384</role-hint>
<implementation>org.sonatype.plexus.components.cipher.DefaultPlexusCipher</implementation>
</component>
</components>
</component-set>
然后在您的 Mojo 中,将密码作为普通属性获取,并将 aSecDispatcher
作为具有相同roleHint
. 如果它不是 Maven 加密字符串,则该decrypt
方法String
将返回字符串本身。
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException;
/**
* @goal echopass
*
* @phase process-sources
*/
public class MyMojo extends AbstractMojo {
/**
* The password
* @parameter expression="${password}"
*/
private String password;
/**
* Plexus component for the SecDispatcher
* @component roleHint="mng-4384"
*/
private SecDispatcher secDispatcher;
private String decrypt(String input) {
try {
return secDispatcher.decrypt(input);
} catch (SecDispatcherException sde) {
getLog().warn(sde.getMessage());
return input;
}
}
public void execute() throws MojoExecutionException {
String s = decrypt(password);
getLog().info("The password is " + s);
}
}
该字符串可以在 中的属性中settings.xml
,在配置文件中,或者您甚至可以在命令行上将加密字符串作为系统属性传递。
参考:
看看这段代码作为一个示例SqlExecMojo。如果您在插件中,则可以获取密码并对其进行解密。如果您想使用它来过滤资源插件中的属性,我们可能需要编写资源插件的自定义版本。我有一个类似的问题可能最终会这样做。
使用 Colselaws 解决方案我得到了一个空指针异常。未设置 SecDispatcher 组件。我需要将注释更改为:
//Plexus component for the SecDispatcher
@Component(role = SecDispatcher.class, hint = "mng-4384")
private SecDispatcher secDispatcher;
请注意,这在任何文档注释之外,并且必须从 Maven 注释插件中导入组件。