8.Maven发布
  与Nexus集成
  存储库管理器是企业中Maven部署的关键部分。存储库管理器充当公共存储库的代理,促进工件共享和团队协作,确保构建稳定性,并实现企业中使用的工件的管理。
  Nexus是来自Sonatype的一个流行的开源存储库管理器。它是一个Web应用程序,允许您维护内部存储库和访问外部存储库。它允许通过单个URL对存储库进行分组和访问。这使得存储库管理员可以在幕后添加和删除新的存储库,而无需开发人员更改其计算机上的配置。此外,它还为使用Maven站点和工件搜索功能生成的站点提供主机功能。
  在我们考虑将Maven与Nexus集成之前,您需要在本地计算机上安装Nexus。 Nexus是作为归档分发的,它附带了一个Jetty实例。从Sonatype的网站www.sonatype.org/nexus/go/下载Nexus发行版(适用于Windows的.zip版本)。在撰写本文时,Nexus的2.10.0-02版本可用。解压缩文件,将内容放在计算机上。在本书中,我们假定内容位于C:\ tools \ nexus文件夹中。 
    注意大多数企业通常在中央服务器上安装并提供存储库管理器。如果您已经可以访问存储库管理器,请跳过此部分安装。

 在管理员模式下启动命令行,并导航到位于C:\ tools \ nexus \ nexus-2.10.0-02下的bin文件夹。然后运行命令nexus install。您将看到成功消息,如图8-1所示。这将安装使Jetty运行的本机服务包装器。


图8-1。 安装Nexus时显示成功消息
  
     注意Nexus 2.10需要JRE 1.7才能正常工作。 确保您的本地计算机上安装了1.7版本的JDK / JRE。 此外,请确保JAVA_HOME指向JDK的版本1.7。
   在同一命令行上,运行命令nexus start启动Nexus。 运行此命令的结果如图8-2所示。

     图8-2。 启动Nexus
   默认情况下,Nexus在端口8081上运行。启动Web浏览器并导航到位于http:// localhost:8081 / nexus的Nexus。 图8-3显示了Nexus启动屏幕。 使用用户名admin和密码admin123登录和浏览Nexus。


图8-3。 Nexus启动屏幕
  现在Nexus已经安装,让我们修改位于C:\ apress \ gswm-book \ chapter8下的gwsm项目。您将首先在pom.xml文件中添加一个distributionManagement元素,如清单8-1所示。此元素用于声明部署项目工件时的位置。存储库元素指示将部署已释放工件的位置。同样,snapshotRepository元素标识将存储项目的SNAPSHOT版本的位置。

  清单8-1。具有distributionManagement的pom.xml

  4.0.0                                           nexusReleases
Releases        http://localhost:8081/nexus/content/repositories/releases                                    nexusSnapshots              Snapshots              http://localhost:8081/nexus/content/repositories/snapshots                   
Note开箱即用,Nexus附带了Releases和Snapshots存储库。默认情况下,SNAPSHOT工件将存储在Snapshots Repository中,而发布工件将存储在Releases存储库中。
  像大多数存储库管理器一样,部署到Nexus是一种受保护的操作。您在settings.xml文件中提供与Nexus交互所需的凭据。
  清单8-2显示了settings.xml文件和服务器信息。提供开箱即用的密码deployment123的Nexus部署用户。请注意,在服务器标记(nexusReleases和nexusSnapshots)中声明的标识必须与pom.xml文件中声明的存储库和snapshotRepository的标识相匹配。使用清单8-2中的代码替换C:\ Users \ << USER_NAME >> \。m2文件夹中的settings.xml文件的内容。
  清单8-2。 Settings.xml具有服务器信息的文件
<?xml version="1.0" encoding="UTF-8" ?>         nexusReleases      deployment      deployment123            nexusSnapshots      deployment      deployment123   
  以下是与Nexus交互的配置步骤。在命令行中,在目录C:\ apress \ gswm-book \ chapter8 \ gswm下运行命令mvn deploy。成功执行命令后,您将在Nexus下的http:// localhost:8081 / nexus / content / repositories / snapshots / com / apress / gswmbook / gswm / 1.0.0-SNAPSHOT /下看到SNAPSHOT工件,如图所示图8-4。


    图8-4。 Nexus下的SNAPSHOT工件

项目发布
  发布项目是一个复杂的过程,它通常包括以下步骤:  
    验证本地机器上没有未提交的更改。
    从pom.xml文件中的版本中删除SNAPSHOT。
    确保项目未使用任何SNAPSHOT依赖项。
    检入修改的pom.xml文件到您的源代码控制。
    创建源代码的源代码控制标签。
    构建新版本的工件,并将其部署到存储库管理器。
    增加trunk的pom.xml文件中的版本,并准备下一个开发周期。
  Maven有一个发布插件,它提供了一个标准机制来执行上述步骤并释放项目工件。正如你所看到的,作为发布过程的一部分,Maven与源代码控制系统进行了大量的交互。在本节中,您将使用Subversion(SVN)作为源代码控制系统。 Maven和SVN之间的典型交互如图8-5所示。 SVN服务器包含包含企业项目的存储库。 Maven版本通常在开发人员或构建机器上执行。 Maven需要在这样的机器上安装SVN命令行工具。 SVN命令行工具允许Maven与SVN交互并执行诸如检出代码,创建标签等操作。

图8-5。 Maven和Subversion之间的交互
  在深入了解Maven发布过程之前,您需要完成以下步骤,使本地机器准备就绪: 
    在本地机器上安装Subversion服务器和SVN命令行工具。
    创建Subversion存储库。
    检查您将要使用到存储库中的项目。  
  Subversion Server命令行工具安装
  有几个开源项目或商业公司提供SVN服务器。在这个项目中,您将使用VisualSVN中的Subversion服务器。
  通过从www.visualsvn.com/downloads/下载64位VisualSVN Server可执行文件来启动安装过程。从图8-6可以看出,服务器可执行文件与SVN命令行工具捆绑在一起。


图8-6。下载VisualSVN服务器  
    注意企业通常将Subversion安装在集中式服务器上并可供使用。如果您已经具有对Subversion服务器的读/写访问权限,则可以跳过Subversion服务器安装步骤。但是,您需要在执行Maven发行版的计算机上安装SVN命令行工具。我们建议VisualSVN的“Apache Subversion命令行工具”,您可以从www.visualsvn.com/downloads/下载和安装。 
  下载后,双击VisualSVN-Server-3.0.0-x64.exe安装文件启动安装屏幕。接受最终用户许可协议,在随后的屏幕上,确保选中“VisualSVN服务器和管理控制台”,并选中“将PND环境变量添加到Subversion命令行工具”选项,如图8所示-7。


图8-7。 VisualSVN服务器设置
  VisualSVN服务器有两种类型:标准版和企业版。标准版提供的功能将满足您在本章中的需求。单击VisualSVN服务器版本屏幕上的标准版按钮。在以下屏幕上,取消选中使用安全连接复选框,如图8-8所示。

图8-8。安装和存储库位置
  在下一个屏幕上,单击安装按钮开始安装。成功安装SVN服务器后,请确保SVN命令行工具已正确安装。为此,请打开一个新命令行并运行命令svn help。您应该看到类似于图8-9所示的输出。

图8-9。运行svn help命令后输出
  创建存储库
  Subversion存储库用于管理文件和文件夹,并跟踪对这些文件和文件夹所做的任何修改。 VisualSVN提供了一个伟大的图形用户界面工具,称为VisualSVN服务器管理器,这使得库的创建和管理轻而易举。在Windows机器上,转到所有程序VisualSVN并启动VisualSVN服务器管理器。按照以下步骤创建新存储库:  
    在服务器管理器的存储库部分下,单击创建新存储库链接。
    在“存储库类型”屏幕中选择常规FSFS存储库选项。点击下一步。
    在图8-10中,输入gswm作为存储库名称。点击下一步。

图8-10。存储库创建        
    在“存储库结构”屏幕中选择单项目存储库选项,如图8-11所示。点击下一步。

图8-11。新的存储库结构
      在“资源库访问权限”屏幕中,接受默认的“所有Subversion用户都具有读/写访问权限”。单击创建。应显示已创建存储库成功消息。单击“完成”。
获取存储库的最后一步是创建一个在gwsm-book存储库上具有读/写访问权限的新用户。按照以下步骤创建新用户: 
    在VisualSVN服务管理器主屏幕上,单击“Subversion身份验证”部分中的创建新用户链接,如图8-12所示。

        图8-12。 Subversion认证部分      
    在“新建用户”窗口中,输入gswm作为用户名,gswm作为密码,如图8-13所示。单击“确定”。


图8-13。新建Subversion用户
  
 检查源代码
 使您的计算机准备好Maven发布的最后一步是将C:\ apress \ gswm-book \ chapter8 \ gswm下的gswm项目检入新创建的存储库。使用命令行,导航到C:\ apress \ gswm-book \ chapter8 \ gswm文件夹,并按顺序运行以下命令: 
    svn checkout http:// localhost / svn / gswm / trunk / C:/ apress / gswm-book / chapter8 / gswm --username gswm --password gswm
    svn add src
    svn add pom.xml
    svn commit -m“Inital commit”
  运行上述命令的输出如图8-14所示。

图8-14。输出从svn初始提交
  使用浏览器,导航到http:// localhost / svn / gswm / trunk。出现提示时,输入用户名gswm和密码gswm,您将看到签入的代码。图8-15显示了预期的浏览器屏幕。

图8-15。项目签入SVN
  
  Maven发布
  使用Maven的发布过程释放工件需要使用两个重要目标:prepare和perform。此外,发布插件提供了一个干净的目标,当事情出错时派上用场。
  准备目标
  准备目标,顾名思义,准备一个项目发布。作为此阶段的一部分,Maven执行以下操作: 
    check-poms:检查pom.xml文件中的版本是否包含SNAPSHOT。
    scm-check-modifications:检查是否有任何未提交的更改。
check-dependency-snapshots:检查pom文件以查看是否存在任何SNAPSHOT依赖性。这是一个最佳实践,您的项目使用已发布的依赖关系。 pom.xml文件中发现的任何SNAPSHOT依赖项都将导致发布失败。
    map-release-versions:当以交互方式运行prepare时,会提示用户提供发布版本。
    map-development-versions:当在交互式模型中运行prepare时,会提示用户下一个开发版本。
    generate-release-poms:生成发布pom文件。
    scm-commit-release:提交将pom文件发布到SCM。
    scm-tag:为SCM中的代码创建发布标签。
    rewrite-poms-for-development:为新的开发周期更新pom文件。
    remove-release-poms:删除为版本生成的pom文件。
    scm-commit-development:提交带有开发版本的pom.xml文件。
    end-release:完成发布的准备阶段。 
  为了方便实现,您将在项目的pom.xml文件中提供SCM信息。清单8-3显示了带有SCM信息的pom.xml文件片段。

  清单8-3。带有SCM信息的pom.xml

  4.0.0                    scm:svn:http://localhost/svn/gswm/trunk        scm:svn:http://localhost/svn/gswm/trunkhttp://localhost/svn/gswm/trunk      

在本地机器上更新pom.xml文件后,运行以下命令将修改的文件提交到SVN:
svn commit -m“添加了SVN信息”
  运行此命令的输出如图8-16所示。


    图8-16。从运行svn commit的输出
  为了使Maven与SVN服务器成功通信,它需要在服务器上具有写访问权限的凭据。您在settings.xml文件中提供该信息,如清单8-4所示。服务器元素的ID被声明为localhost,因为它必须与SVN主机名匹配。
  清单8-4。 pom.xml与SVN服务器详细信息

<?xml version="1.0" encoding="UTF-8" ?>      nexusReleases      deployment      deployment123            nexusSnapshots      deployment      deployment123           localhost     gswm     gswm    

现在,您具有Maven准备目标所需的整个配置。 清单8-5显示了运行准备目标的结果。 因为准备目标是以交互模式运行的,Maven将提示您提供发布版本,发布标签或标签以及新的开发版本。 通过对每个提示按Enter键接受Maven的建议默认值。

   清单8-5。 Maven准备命令

C:\apress\gswm-book\chapter8\gswm>mvn release:prepare[INFO] Scanning for projects...[INFO][INFO] ------------------------------------------------------------------------[INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT[INFO] ------------------------------------------------------------------------[INFO][INFO] --- maven-release-plugin:2.3.2:prepare (default-cli) @ gswm ---[INFO] Verifying that there are no local modifications...[INFO]   ignoring changes on: **\release.properties, **\pom.xml.next, **\pom.xml.releaseBackup, **\pom.xml.backup, **\pom.xml.branch, **\pom.xml.tag[INFO] Executing: cmd.exe /X /C "svn --username gswm --password ***** --no-auth-cache --non-interactive status"[INFO] Working directory: C:\apress\gswm-book\chapter8\gswm[INFO] Checking dependencies and plugins for snapshots ...What is the release version for "Getting Started with Maven"? (com.apress.gswmbook:gswm) 1.0.0: :What is SCM release tag or label for "Getting Started with Maven"? (com.apress.gswmbook:gswm) gswm-1.0.0: :What is the new development version for "Getting Started with Maven"? (com.apress.gswmbook:gswm) 1.0.1-SNAPSHOT: :[INFO] Transforming 'Getting Started with Maven'...---------------------------------------------------------------[INFO] [INFO] Building jar: C:\apress\gswm-book\chapter8\gswm\target\gswm-1.0.0.jar[INFO] [INFO] ------------------------------------------------------------------[INFO] [INFO] BUILD SUCCESS[INFO] [INFO] ------------------------------------------------------------------[INFO] [INFO] Total time: 1.654 s[INFO] [INFO] Finished at: 2014-10-22T23:10:44-06:00[INFO] [INFO] Final Memory: 11M/27M[INFO] [INFO] ------------------------------------------------------------------[INFO] Checking in modified POMs...[INFO] Executing: cmd.exe /X /C "svn --username gswm --password ***** --no-auth-cache --non-interactive commit --file C:\Users\<>\AppData\Local\Temp\maven-scm-203076178.commit --targets C:\Users\<>\AppData\Local\Temp\mavenscm-5496549062663519106-targets"[INFO] Working directory: C:\apress\gswm-book\chapter8\gswm[INFO] Tagging release with the label gswm-1.0.0...[INFO] Executing: cmd.exe /X /C "svn --username gswm --password ***** --no-auth-cache --non-interactive copy --file C:\Users\<>\AppData\Local\Temp\maven-scm-85876759.commit --revision 6 http://localhost/svn/gswm/trunk http://localhost/svn/gswm/tags/gswm-1.0.0"[INFO] Working directory: C:\apress\gswm-book\chapter8\gswm[INFO] Transforming 'Getting Started with Maven'...[INFO] Not removing release POMs[INFO] Checking in modified POMs...[INFO] Executing: cmd.exe /X /C "svn --username gswm --password ***** --no-auth-cache --non-interactive commit --file C:\Users\<>\AppData\Local\Temp\maven-scm-112170711.commit --targets C:\Users\<>\AppData\Local\Temp\maven-scm-2440605286339680080-targets"[INFO] Working directory: C:\apress\gswm-book\chapter8\gswm[INFO] Release preparation complete.[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 33.711 s[INFO] Finished at: 2014-10-22T23:10:44-06:00[INFO] Final Memory: 7M/17M[INFO] ------------------------------------------------------------------------
注意,svn命令作为准备目标的一部分被执行。成功完成准备目标将导致创建SVN标记,如图8-17所示。 gswm项目中的pom.xml文件现在将具有版本1.0.1-SNAPSHOT


图8-17。准备执行时创建的SVN标记
  清洁目标
  准备目标执行很多活动,并生成临时文件,如release.properties和pom.xml.releaseBackup,作为其执行的一部分。成功完成后,它会清除这些临时文件。有时,准备目标可能会失败(例如,无法连接到SVN),并使项目处于脏状态。这是释放插件的干净的目标进入了画面。顾名思义,它会删除作为发布执行的一部分生成的任何临时文件。
    注意只有在准备目标失败时,才能使用clean目标。
  执行目标
  执行目标负责从新创建的标签中检出代码,并构建并将释放的代码部署到远程存储库中。
以下阶段作为执行目标的一部分执行: 
    verify-completed-prepare-phases:这验证了在运行执行目标之前已经执行了准备阶段。
    checkout-project-from-scm:从SCM标记中检出已发布的代码。
    run-perform-goal:执行与perform相关联的目标。默认目标是部署。
  在gswm项目上运行perform目标的输出如清单8-6所示。
  清单8-6。 Maven执行命令

C:\apress\gswm-book\chapter8\gswm>mvn release:perform[INFO] Scanning for projects...[INFO][INFO] ----------------------------------------------------------[INFO] Building Getting Started with Maven 1.0.1-SNAPSHOT[INFO] ----------------------------------------------------------[INFO][INFO] --- maven-release-plugin:2.3.2:perform (default-cli) @ gswm ---[INFO] Checking out the project to perform the release ...[INFO] Executing: cmd.exe /X /C "svn --username gswm --password ***** --no-auth-cache --non-interactive checkout http://localhost/svn/gswm/tags/gswm-1.0.0 C:\apress\gswm-book\chapter8\gswm\target\checkout"[INFO] Working directory: C:\apress\gswm-book\chapter8\gswm\target---------------------------------[INFO] [INFO] Installing C:\apress\gswm-book\chapter8\gswm\target\checkout\target\gswm-1.0.0.jar to C:\Users\<>\.m2\repository\com\apress\gswmbook\gswm\1.0.0\gswm-1.0.0.jar[INFO] [INFO] Installing C:\apress\gswm-book\chapter8\gswm\target\checkout\pom.xml to C:\Users\<>\.m2\repository\com\apress\gswmbook\gswm\1.0.0\gswm-1.0.0.pom sources.jar to C:\Users\<>\.m2\repository\com\apress\gswmbook\gswm\1.0.0\gswm-1.0.0-sources.jar[INFO] [INFO] Installing C:\apress\gswm-book\chapter8\gswm\target\checkout\target\gswm-1.0.0-javadoc.jar to C:\Users\<>\.m2\repository\com\apress\gswmbook\gswm\1.0.0\gswm-1.0.0-javadoc.jar[INFO] [INFO][INFO] [INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ gswm ---[INFO] Uploading: http://localhost:8081/nexus/content/repositories/releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0.jar[INFO] 2/3 KB[INFO] 3/3 KB[INFO][INFO] Uploaded: http://localhost:8081/nexus/content/repositories/releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0.jar (3 KB at 13.4 KB/sec)[INFO] Uploading: http://localhost:8081/nexus/content/repositories/releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0.pom[INFO] 2/3 KB[INFO] 3/3 KB[INFO][INFO] Uploaded: http://localhost:8081/nexus/content/repositories/releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0.pom (3 KB at 14.5 KB/sec)[INFO] Downloading: http://localhost:8081/nexus/content/repositories/releases/com/apress/gswmbook/gswm/maven-metadata.xml[INFO][INFO] Uploaded: http://localhost:8081/nexus/content/repositories/releases/com/apress/gswmbook/gswm/1.0.0/gswm-1.0.0-javadoc.jar (35 KB at 368.5 KB/sec)[INFO] [INFO] BUILD SUCCESS[INFO] [INFO] ----------------------------------------------------[INFO] [INFO] Total time: 3.807 s[INFO] [INFO] Finished at: 2014-10-22T23:26:36-06:00[INFO] [INFO] Final Memory: 17M/42M[INFO] [INFO] ----------------------------------------------------[INFO] Cleaning up after release...[INFO] -----------------------------------------------------------[INFO] BUILD SUCCESS[INFO] -----------------------------------------------------------[INFO] Total time: 5.867 s[INFO] Finished at: 2014-10-22T23:26:36-06:00[INFO] Final Memory: 8M/19M[INFO] -----------------------------------------------------------
这完成了1.0.0版本的gswm项目的发布。 该工件最终会出现在Nexus存储库管理器中,如图8-18所示


图8-18。 Nexus与已发布的工件神器

总结

  Nexus等内部存储库管理器允许企业完全采用Maven。 除了担当公共存储库代理之外,它们还支持组件共享和治理。 本章讨论将Maven与Nexus整合,并指导您完成将工件部署到Nexus的过程。 您还学习了Maven的发布过程及其不同的阶段。

更多相关文章

  1. 移动端对html input标签文件选择支持
  2. 【Android】利用表格布局,Android中xml文件与java的交互制作登录
  3. 转-Lottie开源动画库介绍与使用示例
  4. Android(安卓)sdcard媒体文件更新(程序控制刷新MediaStore数据库)
  5. Android(安卓)Odex
  6. App实战:移动端Mock Api的几种方式
  7. C#实现Android自动打包工具
  8. Android(安卓)studio 引入简单的高德地图(一)
  9. Apk脱壳圣战之---脱掉“爱加密”的壳

随机推荐

  1. android中SMS
  2. Android(安卓)编程下 Touch 事件的分发和
  3. Android(安卓)常用开发工具类
  4. android 工程混淆
  5. android locationManager定位
  6. android布局 LinearLayout和RelativeLayo
  7. android实现获取有线和无线Ip地址的方法
  8. android 4.0后请求网络android.os.Networ
  9. Android(安卓)apk间通过设置sharedUserId
  10. 我的Android进阶之旅------>Android百度