释放

介绍

maven-release 插件的主要目的是提供一种标准机制来在直接开发团队之外发布项目工件。该插件提供了创建发布和相应地更新项目的 SCM 的基本功能。

要创建发布,maven-release 插件通过 maven 分两个阶段执行:

  1. 准备发布。
  2. 执行发布。

准备发布

该插件会将发布信息记录到项目的pom.xml文件的新修订版中,并将 SCM 版本控制应用于项目的资源。

release:prepare目标将:

  1. 验证工作区中没有未提交的更改。
  2. 提示用户输入所需的标签、发布和开发版本名称。
  3. 修改发布信息并将其提交到pom.xml文件中。
  4. 用新的标记名称标记整个项目源代码树。

以下示例显示如何release:prepare使用 Subversion SCM 运行目标。命令行示例指示插件在本地文件系统上定位 Subversion SCM。

mvn release:prepare \
        -Dproject.scm.developerConnection=scm:svn:file:///D:/subversion_data/repos/my_repo/my-app-example/trunk \
        -DtagBase=file:///D:/subversion_data/repos/my_repo/my-app-example/tags

使用release:prepare目标时,用户必须向 maven 提供有关项目 SCM 当前位置的信息。在前面的示例中,为 maven 提供了开发主干的当前位置和记录项目标记实例的新位置。

  • project.scm.developerConnection

    开发主干的当前位置。适用于 SCM 提供程序的有效 SCM URL 格式。“SCM:Provider:”前缀用于确定正在使用的提供程序。

  • 标签库

    记录标记版本的新位置。适用于 SCM 提供程序的有效 SCM URL 格式,不带“SCM:Provider:”前缀。

前面的目标参数可以在命令行执行 maven 时提供(如前面的示例所示),也可以在项目的pom.xml文件中定义和维护。当前开发主干的位置在pom.xml文件中以下列形式定义:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Application</name>
  <url>http://app.mycompany.com</url>
  ...
  <scm>
    <developerConnection>scm:svn:file:///D:/subversion_data/repos/my_repo/my-app-example/trunk</developerConnection>
  </scm>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.5.2</version>
        <configuration>
          ...
          <tagBase>
            file:///D:/subversion_data/repos/my_repo/my-app-example/tags
          </tagBase>
          ...
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project> 

要在pom.xml文件中定义 tagBase 参数,必须在plugins/plugin/configuration元素中定义 tagBase元素。以下示例显示了它在pom.xml文件中的外观。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Application</name>
  <url>http://app.mycompany.com</url>
  ...
  <scm>
    <developerConnection>scm:svn:file:///D:/subversion_data/repos/my_repo/my-app-example/trunk</developerConnection>
  </scm>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.5.2</version>
        <configuration>
          ...
          <tagBase>
            file:///D:/subversion_data/repos/my_repo/my-app-example/tags
          </tagBase>
          ...
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project> 

release:prepare目标执行期间,maven 将与用户交互以收集有关当前版本的信息。Maven 将提示用户输入以下信息:

  • 所需的 SCM 提供程序标签名称

    这是一个 SCM 提供程序特定的值,在 Subversion SCM 提供程序的情况下,该值等于将出现在 tagBase 参数提供的 URL 下的文件夹名称。

  • 所需的项目发布版本

    此值放置在定义当前版本的pom.xml中。如果开发pom.xml的版本值为 1.0-SNAPSHOT,则发布版本将为 1.0。这不是强制的,可以是适合您自己或公司环境的值。

  • 一个新的开发版本

    该值放置在用于继续开发的pom.xml文件的下一个修订版中。如果当前版本代表版本 1.0,则适当的值可能是 2.0-SNAPSHOT。SNAPSHOT 指示符是准备和执行未来版本所必需的。然后在pom.xml文件的下一个开发版本中提交该值。

在为 maven 提供所需信息后,maven-release 插件将与项目的 SCM 交互并定义要提取和部署的版本。同时,该项目的开发主干已更新,允许开发人员继续进行进一步的修改,这些修改将包含在未来的版本中。

执行发布

该插件将提取与当前版本相关的文件修订。Maven 会将版本化的项目源代码编译、测试和打包成一个工件。然后,最终的可交付成果将发布到适当的 Maven 存储库中。

release:perform目标将:

  1. 提取在新标签名称下版本化的文件修订。
  2. 在提取的项目实例上执行 maven 构建生命周期。
  3. 将版本化的工件部署到适当的本地和远程存储库。

以下示例显示如何从命令行运行release:perform目标。

mvn release:perform

release:perform目标需要一个名为release.properties的文件存在于项目根目录中。release.properties文件是在目标执行期间构建的,release:prepare包含定位和提取项目的正确标记版本所需的所有信息。下面显示的是可以出现在release.properties文件实例中的内容示例。

注意:release.properties文件的位置正在审核中,可以移动到目标目录。

#Generated by Release Plugin on: Sat Nov 12 11:22:33 GMT 2005
#Sat Nov 12 11:22:33 GMT 2005
maven.username=myusername
checkpoint.transformed-pom-for-release=OK
scm.tag=1.0
scm.url=scm\:svn\:file\:///D\:/subversion_data/repos/my_repo/my-app-example/trunk
scm.tag-base=file\:///D\:/subversion_data/repos/my_repo/my-app-example/tags
checkpoint.transform-pom-for-development=OK
checkpoint.local-modifications-checked=OK
checkpoint.initialized=OK
checkpoint.checked-in-release-version=OK
checkpoint.tagged-release=OK
checkpoint.prepared-release=OK
checkpoint.check-in-development-version=OK

release.properties文件是在准备发布时创建的。执行发布后,文件保留在项目根目录中,直到 maven 用户将其删除。release.properties文件可以提供给团队中的任何开发人员,并且只需执行目标release:perform就可以一次又一次地创建和部署项目工件的新实例。

release:perform目标执行期间,整个 Maven 构建生命周期都在项目上执行。提取、编译、测试、记录和部署标记的项目源代码。发布工件的一个实例被部署到机器的本地存储库中。通过配置pom.xml文件中的distributionManagement元素,可以将发布的另一个实例部署到远程存储库。

以下是如何在项目pom.xml文件中配置 distributionManagement 元素的示例。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Application</name>
  <url>http://app.mycompany.com</url>
  ...
  <distributionManagement>
    <repository>
      <id>myRepoId</id>
      <name>myCompanyReporsitory</name>
      <url>ftp://repository.mycompany.com/repository</url>
    </repository>
  </distributionManagement>
  ...
</project>

如果没有在pom.xml文件中配置 distributionManagement 元素,那么工件的部署将失败。Maven 将向用户报告执行 maven-deploy 插件失败。有关 maven-deploy 插件的使用,请参阅 maven 文档和其他迷你指南。

在目标执行完成后,将创建以下可交付成果并将其部署到本地和远程存储库release:perform

  • 工件 ID -版本.jar

    项目当前版本的二进制文件。

  • 工件 id -版本-javadoc.jar

    解释当前版本中类的当前功能的 javadoc。

  • 工件 id -版本-source.jar

    用于构建项目当前版本的源代码修订版。

  • 工件 id -版本.pom

    用于创建项目当前版本的pom.xml文件的内容。

故障排除

我得到一个“无法确定主机'主机'的真实性。” 错误并且构建挂起

这是因为您的~user/.ssh/known_hosts文件没有列出主机。您通常会收到将主机添加到已知主机列表的提示,但 Maven 不会传播该提示。known_hosts解决方案是在执行Maven之前添加主机文件。在 Windows 上,这可以通过安装 OpenSSH 客户端(例如SSHWindows)、运行ssh <host> 并接受添加主机来完成。

站点部署目标挂起

首先,这意味着您已成功将工件部署到远程存储库,并且现在只有站点部署存在问题。停止构建,cd 到target/checkout > 并通过执行再次运行构建mvn site:deploy。您应该会看到一个提示,要求您输入密码。如果您的密钥不在服务器上的授权密钥中,则会发生这种情况。