在使用Maven GPG Plugin之前,首先需要确认命令行下的gpg是可用的,然后如下所示配置POM。
<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为此提供了另外一个目标。例如:
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在项目发布的时候运行,那么如何判断项目发布呢?在超级POM中有一个release-profile,该Profile只有在Maven属性performRelease为true的时候才被激活,而release:perform执行的时候,就会将该属性置为true,这正是项目进行版本发布的时刻。因此,类似的,可以在settings.xml或者POM中创建如下所示的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配置,如下所示。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactid>maven-release-plugin</artifactid>
<version>2.0</version>
<configuration>
<tagBase>http://192.168.1.103/app/tags/</tagBase>
<branchBase>https://192.168.1.103/app/branches</branchBase>
</configuration>
</plugin>
至此,一个较为规范的自动化签名配置就完成了。当执行release:perform发布项目版本的时候,maven-gpg-plugin会被自动调用对构件进行签名。当然,这个时候你需要根据命令行提示输入私钥密码。