13.6.2 Maven GPG Plugin

手动地对Maven构件进行签名并将这些签名部署到Maven仓库中是一件耗时的体力活。而使用Maven GPG Plugin只需要提供几行简单的配置,它就能够帮我们自动完成签名这一工作。

在使用Maven GPG Plugin之前,首先需要确认命令行下的gpg是可用的,然后如代码清单13-5所示配置POM。

代码清单13-5 配置maven-gpg-plugin为项目提供签名


<project>

……

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-gpg-plugin</artifactId>

<version>1.0</version>

<executions>

<execution>

<id>sign-artifacts</id>

<phase>verify</phase>

<goals>

<goal>sign</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

……

</project>


然后就可以使用一般的mvn命令签名并发布项目构件:


$mvn clean deploy-Dgpg.passphrase=yourpassphrase


如果不提供-Dgpg.passphrase参数,运行时就会要求输入密码。

如果有一些已经发布了但没有被签名的文件,你仍然想对其签名并发布到Maven仓库中,上述方式显然是行不通的,因为POM已经不允许被修改。好在Maven GPG Plugin为此提供了另外一个目标。例如:


$mvn gpg:sign-and-deploy-file

>-DpomFile=target/myapp-1.0.pom

>-Dfile=target/myapp-1.0.jar

>-Durl=http://oss.sonatype.org/service/local/staging/deploy/maven2/

>-DrepositoryId=sonatype_oss


在这里可以指定要签名的POM及相关文件、Maven仓库的地址和ID,Maven GPG Plugin就会帮你签名文件并部署到仓库中。

读者可以想到,GPG签名这一步骤只有在项目发布时才显得必要,对日常的SNAPSHOT构件进行签名不仅没有多大的意义,反而会比较耗时。因此,只需要配置Maven PGP Plugin在项目发布的时候运行,那么如何判断项目发布呢?回顾代码清单13-3,在超级POM中有一个release-profile,该Profile只有在Maven属性performRelease为true的时候才被激活,而release:perform执行的时候,就会将该属性置为true,这正是项目进行版本发布的时刻。因此,类似地,可以在settings.xml或者POM中创建如代码清单13-6所示Profile。

代码清单13-6 配置自动激活的Profile对项目进行签名


<profiles>

<profile>

<id>release-sign-artifacts</id>

<activation>

<property>

<name>performRelease</name>

<value>true</value>

</property>

</activation>

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-gpg-plugin</artifactId>

<version>1.0</version>

<executions>

<execution>

<id>sign-artifacts</id>

<phase>verify</phase>

<goals>

<goal>sign</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

</profile>

</profiles>


最后需要一提的是,由于一个已知的Maven Release Plugin的Bug,release:perform执行过程中签名可能会导致进程永久挂起。为了避免该情况,用户需要为Maven Release Plugin提供mavenExecutorId配置,如代码清单13-7所示。

代码清单13-7 配置maven-release-plugin避免签名时永久挂起


<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-release-plugin</artifactId>

<version>2.0</version>

<configuration>

<tagBase>https://192.168.1.103/app/tags/</tagBase>

<branchBase>https://192.168.1.103/app/branches/</branchBase>

<mavenExecutorId>forked-path</mavenExecutorId>

</configuration>

</plugin>


至此,一个较为规范的自动化签名配置就完成了。当执行release:perform发布项目版本的时候,maven-gpg-plugin会被自动调用对构件进行签名。当然,这个时候你需要根据命令行提示输入私钥密码。