发布Maven工程到中央仓库
注册帐号 https://issues.sonatype.org/secure/Signup!default.jspa
新建项目 https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
sonatype对发布的jar有一些要求,必须包括:源码(既然是开源,那么源码肯定是少不了的)、javaDoc、gpg签名。下面介绍如何安装gpg工具,然后生成签名文件。
签名
参考这里安装gpg。完成后,按照下面的步骤生成密钥。
gpg --gen-key 生成密钥,成功后,会有类似如下的输出。
gpg: key 69EC4448C6CE32EB marked as ultimately trusted
gpg: directory ‘/Users/mac/.gnupg/openpgp-revocs.d’ created
69EC4448C6CE32EB就是我们需要的keyname,会在maven的settings.xml中配置。
修改settings.xml 增加账户信息:
<server>
  <id>hello</id>
  <username>name</username>
  <password>passwd</password>
</server>
设置gpg的profile:
<profile>
  <id>hello</id>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
  <properties>
    <gpg.executable>gpg2</gpg.executable>
    <gpg.passphrase>pass</gpg.passphrase>
  </properties>
</profile>
需要注意的是,gpg有两个版本gpg和gpg2。maven的gpg插件,默认使用gpg命令来作签名,如果你需要使用gpg2的话,可以在参考上面的配置来修改(gpg.executable)。另外,上面的配置中,直接写了密钥,这样可能是不安全的。你可以在配置文件中配置keyname,如下所示:
<gpg.keyname>69EC4448C6CE32EB</gpg.keyname>
<profile>
  <id>gpg</id>
  <properties>
    <gpg.keyname>4FD28481A917951C</gpg.keyname>
  </properties>
</profile>
修改pom文件
<distributionManagement>
    <repository>
        <id>oss-sonatype-staging</id>
        <name>Sonatype Staging Repository</name>
        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
    </repository>
    <snapshotRepository>
        <id>oss-sonatype-staging</id>
        <name>OSS Sonatype Nexus Snapshots</name>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
</distributionManagement>
上面的配置,描述了版本(release、snapshot)的发布地址。另外,这里的id需要和settings.xml中server的id保持一致。然后,添加生成javaDoc、源码等的Maven插件:
<profiles>
<profile>
  <id>release</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <executions>
          <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.3.1</version>
        <executions>
          <execution>
            <id>enforce-no-snapshots</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireReleaseDeps>
                  <message>No Snapshots Allowed!</message>
                </requireReleaseDeps>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <version>2.10.3</version>
        <configuration>
          <additionalparam>${javadoc.opts}</additionalparam>
        </configuration>
        <executions>
          <execution>
            <id>attach-javadocs</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</profile>
<profile>
  <id>doclint-java8-disable</id>
  <activation>
    <jdk>[1.8,)</jdk>
  </activation>
  <properties>
    <javadoc.opts>-Xdoclint:none</javadoc.opts>
  </properties>
</profile>
</profiles>
发布
经过上面繁琐的配置后,现在终于可以发布项目到Maven公共仓库了。
在项目根目录下(根据需要自行选择),执行命令mvn deploy
如果没有任何报错的话,会先把jar等文件上传(upload)。等上传完成后,你需要登录https://oss.sonatype.org ,点击左侧菜单Staging Repositories。从列表中找到你刚刚上传的工程,选中后点击Close。如果你不想每次手动完成该步骤,可以在pom.xml中添加下面的插件配置来实现自动化:
<plugin>
  <groupId>org.sonatype.plugins</groupId>
  <artifactId>nexus-staging-maven-plugin</artifactId>
  <version>1.6.7</version>
  <extensions>true</extensions>
  <configuration>
      <serverId>nexus-snapshots</serverId>
      <nexusUrl>https://oss.sonatype.org/</nexusUrl>
      <autoReleaseAfterClose>true</autoReleaseAfterClose>
  </configuration>
</plugin>
多模块 有些Maven工程是多模块工程,这时候,如果我们希望把特定的模块在deploy的时候排除掉,可以通过下面的配置来实现:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-deploy-plugin</artifactId>
    <version>2.8.2</version>
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin>
你可以把上面的配置添加到需要排除的模块中。