我正在尝试设置我的 Maven 构建,以便它自动对 JAR 进行签名,而无需手动输入密码,但是无论我如何尝试配置maven-gpg-plugin
它要么失败,要么总是要求输入密码。
我使用此页面作为有关如何设置Mavensettings.xml
的指导:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg2</gpg.executable>
<gpg.keyname>${env.GPG_KEY_NAME}</gpg.keyname>
<gpg.passphrase>${env.GPG_PASS_PHRASE}</gpg.passphrase>
</properties>
</profile>
</profiles>
<servers>
<server>
<id>ossrh</id>
<username>${env.OSSRH_JIRA_USERNAME}</username>
<password>${env.OSSRH_JIRA_PASSWORD}</password>
</server>
</servers>
</settings>
上述环境变量是在环境中设置的。
这个问题maven-gpg-plugin
配置,我尝试按如下方式设置 POM:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
<configuration>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>
但是当我构建时,我收到以下错误:gpg: setting pinentry mode 'loopback' failed: Not supported
我试图将allow-loopback-pinentry
添加到gpg-agent.conf,但结果是一样的。 如果我从Maven插件配置中删除<gpgArguments>
,则会收到弹出窗口,要求输入密码。
我正在使用 gpg2 版本 2.1.11
插件文档说默认可执行文件是gpg
.如果未启用配置文件,它是否会选取您想要的gpg2
?useAgent
== true 是默认值,对于每个文档的 gpg2,应该保持这种方式。
要使用代理,请尝试在插件而不是配置文件中配置可执行文件。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
<configuration>
<executable>gpg2</executable>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>
要在没有代理的情况下使用settings.xml
文件执行此操作,请尝试以下操作(基于我对目标和使用文档的阅读):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
<configuration>
<executable>gpg2</executable>
<keyname>${gpg.keyname}</keyname>
<passphraseServerId>${gpg.keyname}</passphraseServerId>
</configuration>
</execution>
</executions>
</plugin>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<properties>
<gpg.keyname>${env.GPG_KEY_NAME}</gpg.keyname>
</properties>
<servers>
<server>
<id>${env.GPG_KEY_NAME}</id>
<passphrase>${env.GPG_PASS_PHRASE}</passphrase>
</server>
</servers>
</settings>
请注意,我没有按照他们的建议使用配置文件,因为根据 Maven 配置文件文档(强调我的):
将自动对所有构建处于活动状态,除非使用前面描述的方法之一激活同一 POM 中的另一个配置文件。当 POM 中的配置文件在命令行上或通过其激活配置激活时,默认情况下处于活动状态的所有配置文件都会自动停用。
这给我带来了"有趣"的调试会话,我也看到它吸引了许多其他毫无戒心的开发人员。
出现此问题的原因是我尝试使用gpg2
而不是gpg
,因为我认为gpg2
更好(没有实际研究)。gpg 2 的手册页指出:
与来自 GnuPG 1.x 的独立命令 gpg 相反,它是 可能更适合服务器和嵌入式平台,2.x 版本通常以 GPG2 的名称安装,并针对 桌面需要 要安装的其他几个模块。
gpg2
针对桌面,因此我假设是"硬编码"来询问密码,实际上我应该使用gpg
。