文档结构  
可译网翻译有奖活动正在进行中,查看详情 现在前往 注册?
原作者:sonatype    来源:central.sonatype.org [英文]
班纳睿    计算机    2017-01-05    0评/612阅
翻译进度:已翻译   参与翻译: 班纳睿 (18)

简介

Apache Maven 启动了Central Repository,并把所有的模块和需要的依赖都发布到这个中央仓库中,当时它叫做Maven Central。Maven默认配置中,连接的是该中央仓库,并且从它下载需要的一切东西包括你的项目的依赖。

我们推荐使用Maven 3的稳定版本,因为Apache Maven的其他版本包括Maven 2 和 Maven 1的所有版本已经结束了生命周期,并且不再被该项目的维护团队所支持了。而且一些早期的Maven发行版本还有一些为人所知的问题,包括签名模块和其他一些方面的问题。

第 1 段(可获 1.3 积分)

为了满足所有的需求,一个Maven构建配置可以由多种方式来建立,我们会在下文中讨论所有这些适用的细节。

要注意的是,虽然这些指令被Sonatype认为是最佳实践,但是每个人的观点不同,你可以在后文中的 附加信息 部分找到其他文档的链接。

其他先决条件

除了Apache Maven的安装,你还需要安装一个GPG客户端,并且要把它的位置放在命令行的path中,以便于Maven GPG 插件能够找到它。 更多的信息,请参考http://www.gnupg.org/ 以及插件文档 和下文。

第 2 段(可获 1.21 积分)

分发管理与认证

为了在Maven中使用 Nexus Staging Maven 插件配置部署到OSSRH Nexus 仓库管理器(Repository Manager)中, 你需要做以下配置:

<distributionManagement>
  <snapshotRepository>
    <id>ossrh</id>
    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  </snapshotRepository>
</distributionManagement>
<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <version>1.6.7</version>
      <extensions>true</extensions>
      <configuration>
        <serverId>ossrh</serverId>
        <nexusUrl>https://oss.sonatype.org/</nexusUrl>
        <autoReleaseAfterClose>true</autoReleaseAfterClose>
      </configuration>
    </plugin>
    ...
  </plugins>
</build>
第 3 段(可获 0.38 积分)

因为 OSSRH 一直运行着最新可用版本的Sonatype Nexus Repository Manager,所以我们最好也是使用Nexus Staging Maven 插件的最新版本:

另外如果你在使用Maven默认的部署插件,你需要添加一个完整的distributionManagement 部分

<distributionManagement>
  <snapshotRepository>
    <id>ossrh</id>
    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  </snapshotRepository>
  <repository>
    <id>ossrh</id>
    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
  </repository>
</distributionManagement>
第 4 段(可获 0.61 积分)

以上的配置将会从你的Maven settings.xml文件中读取用户账户信息从而部署到OSSRH中。使用认证的最小的配置如下:

<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>your-jira-id</username>
      <password>your-jira-pwd</password>
    </server>
  </servers>
</settings>

注意,在settings.xml文件中,server元素中的id元素 跟snapshotRepository 和 repository 元素中的id元素,还有 Nexus Staging Maven 插件的configuration中的 serverId 元素应该是一致的。

第 5 段(可获 0.66 积分)

生成Javadoc 和 源代码附件

要想生成Javadoc 和 Source的 jar文件,你还得配置 javadoc 和 source的 Maven 插件。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
      <version>2.2.1</version>
      <executions>
        <execution>
          <id>attach-sources</id>
          <goals>
            <goal>jar-no-fork</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>2.9.1</version>
      <executions>
        <execution>
          <id>attach-javadocs</id>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
第 6 段(可获 0.28 积分)

GPG 签名组件

Maven GPG 插件是用来给组件签名的,可以按照如下进行配置:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-gpg-plugin</artifactId>
      <version>1.5</version>
      <executions>
        <execution>
          <id>sign-artifacts</id>
          <phase>verify</phase>
          <goals>
            <goal>sign</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

要想使用这个组件,需要事先安装gpg命令行工具,并且使GPG凭证可以获取到,比如从settings.xml文件中。此外,你可以配置gpg的命令行,以免它和gpg本身有所不同。这在一些操作系统上是比较常见的情况.。

第 7 段(可获 0.75 积分)
<settings>
  <profiles>
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>the_pass_phrase</gpg.passphrase>
      </properties>
    </profile>
  </profiles>
</settings>

如果你在安装和配置GPG时有什么问题,请阅读我们的详细指令

使用Nexus Staging Maven Plugin配置部署和发布模块

使用Nexus Staging Maven Plugin是我们推荐用于部署到OSSRH以及发布到 Central Repository 的方式。要想配置它,只需在你的Maven的pom.xml文件中加入这个插件。

第 8 段(可获 0.71 积分)
<build>
<plugins>
...
<plugin>
  <groupId>org.sonatype.plugins</groupId>
  <artifactId>nexus-staging-maven-plugin</artifactId>
  <version>1.6.7</version>
  <extensions>true</extensions>
  <configuration>
     <serverId>ossrh</serverId>
     <nexusUrl>https://oss.sonatype.org/</nexusUrl>
     <autoReleaseAfterClose>true</autoReleaseAfterClose>
  </configuration>
</plugin>

如果你的版本是一个发布版本(也就是没有以-SNAPSHOT结尾),那么有了这个设置之后,你就可以像往常一样,运行部署到OSSRH和自动的发布到Central Repository :

第 9 段(可获 0.45 积分)
mvn clean deploy

将autoReleaseAfterClose属性设置为false,你就可以在Nexus Repository Manager中手动的检查 staging 仓库,并且之后再发布staging 仓库,可以使用如下命令:

mvn nexus-staging:release

如果你发现出问题了,就可以删掉该staging仓库,使用如下命令:

mvn nexus-staging:drop

请阅读《使用Nexus 进行仓库管理》这本书的 Build Promotion with the Nexus Staging Suite 章节中获取更多关于Nexus Staging Maven Plugin的信息。

过期的oss-parent

在过去,所有的插件配置和其他配置都是由Maven的一个顶级POM进行管理,并且带有最新的org.sonatype.oss:oss-parent:9坐标。这个项目将 SCM、URL以及其他详细信息给泄露出去,所以不建议再使用它了。该项目的维护已经终止了,并且它和最新的工具如Maven版本或Java版本都没办法一起使用。如果需要,请以类似的方式管理你们自己的组织级别的POM。

第 10 段(可获 1.71 积分)

使用Profile

由于javadoc和源代码的jar包的生成和使用GPG进行签名的组件都是相当耗时间的进程,所以这些执行操作通常都会跟普通的构建配置隔离开来,并转到一个profile里。我们可以使用这个profile,当激活它的时候,就可以执行相应的部署操作。

<profiles>
  <profile> 
    <id>release</id>
    <build>
      ...
      javadoc, source and gpg plugin from above
      ...
    </build>
  </profile>
</profiles>

执行快照版本的部署

当你的版本号以-SNAPSHOT结尾的时候,执行的时候就会进行snapshot部署。在执行snapshot部署时你不需要满足所有的要求,只需要在你的项目上简单的运行如下命令:

第 11 段(可获 1.06 积分)
mvn clean deploy

SNAPSHOT版本不会被同步到Central Repository。如果你希望你的用户使用你的SNAPSHOT版本,他们就需要将snapshot的仓库加入到他们的 Nexus Repository Manager、settings.xml或者pom.xml文件中。成功部署的SNAPSHOT版本可以在https://oss.sonatype.org/content/repositories/snapshots/ 这里找到。

执行发布版本的部署

为了能够执行发布版本的部署,你需要编辑你所有的POM文件来使用发布版本。这意味着他们的版本号不能以-SNAPSHOT结尾,此外插件和依赖的声明也不能使用snapshot版本。这样是为了确保你只能依赖其他的发布版本的组件。理想情况下,他们在Central Repository都可以找到。这样你的用户就可以从Central Repository中将你的组件连同传递依赖的组件一起获取到。

第 12 段(可获 1.73 积分)

你的项目,包括带有多个子模块的父项目的版本号的变更,可以手动执行,或者也可以通过Maven的versions插件来操作,命令如下:

mvn versions:set -DnewVersion=1.2.3

一旦你更新完所有的版本号并且确保你的构建都在没有部署的情况下通过之后,你就可以使用release的profile进行部署了:

mvn clean deploy -P release

这个过程与你的SCM系统的工作流是完全独立的。如果你想让Central Repository中的某个特定版本跟你的SCM系统中的某一特定版本保持一致的话,这样是一个不错的实践,你可以和如下流程类似的方式手动执行提交:

第 13 段(可获 1.35 积分)
  • 开发,继续开发,不断开发
  • 提交任何显著的变更
  • 通过验证构建
  • 更新版本号为发布版本
  • 提交发布版本
  • 执行部署
  • 更新版本号为下一个snapshot版本
  • 提交新的snapshot版本
  • 开发,继续开发, 不断开发,清洗并重复

或者你可以使用你选择的配置脚本在CI服务器上进行自动化运行,又或者你可以使用Maven的release插件,这将在下文中阐述。

使用Maven Release Plugin执行发布版本的部署

Maven Release Plugin 可以用来自动执行Maven POM 文件的变更,健康检查,以及一些必要的SCM操作和实际的部署执行操作。

第 14 段(可获 1.3 积分)

Maven release plugin的配置应该包括禁用作为Maven 的超级 POM的一部分的release profile,因为我们要使用我们自己的profile,并且指定部署目标和激活release profile。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-release-plugin</artifactId>
  <version>2.5.3</version>
  <configuration>
    <autoVersionSubmodules>true</autoVersionSubmodules>
    <useReleaseProfile>false</useReleaseProfile>
    <releaseProfiles>release</releaseProfiles>
    <goals>deploy</goals>
  </configuration>
</plugin>
第 15 段(可获 0.5 积分)

当SCM连接被正确配置了以后,你就可以将一个发布版本部署到OSSRH上,使用以下命令:

mvn release:clean release:prepare

并将版本号和标签输入到对应的提示之后,然后在执行以下命令:

mvn release:perform

这个语句的执行会一键完成部署到OSSRH中并发布到Central Repository的操作,这是因为使用了Nexus Staging Maven Plugin并且将autoReleaseAfterClose设为true。

手动发布部署到Central Repository

如果你使用默认的Maven部署插件,并将autoReleaseAfterClose设为false,那么你可以手动检查并选择发布已部署的artifacts

第 16 段(可获 1.14 积分)

另外,如果你已经使用Nexus Staging Maven Plugin 完成了部署,而且部署成功,你就可以使用命令行直接发布仓库。刚刚完成了部署的时候,在target目录下有一个属性文件,里面包含所有需要的信息,你就可以使用以下命令很容易的发布staging仓库:

mvn nexus-staging:release

如果你是使用Maven发布插件在执行一个发布的同时执行的部署操作,那么部署就是从你的版本控制系统检出到target/checkout目录下然后完成的,所以你需要从那里运行Nexus Staging 插件:

第 17 段(可获 1.2 积分)
mvn release:perform
...
cd target/checkout
mvn nexus-staging:release

你可以使用发布插件添加它为部署以后执行的一个目标,让它作为你的发布版本部署的一部分,这样就可以将这个目标配置为自动执行。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-release-plugin</artifactId>
  <configuration>
    <goals>deploy nexus-staging:release</goals>
    ...

其他信息

第 18 段(可获 1.11 积分)

文章评论