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会被自动调用对构件进行签名。当然,这个时候你需要根据命令行提示输入私钥密码。