与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。
现在Nexus已经安装,让我们修改位于C:\ apress \ gswm-book \ chapter8下的gwsm项目。您将首先在pom.xml文件中添加一个distributionManagement元素,如清单8-1所示。此元素用于声明部署项目工件时的位置。存储库元素指示将部署已释放工件的位置。同样,snapshotRepository元素标识将存储项目的SNAPSHOT版本的位置。
清单8-1。具有distributionManagement的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0
</modelVersion>
<!-- Content removed for brevity -->
<distributionManagement>
<repository>
<id>nexusReleases
</id>
<name>Releases
</name>
<url>http://localhost:8081/nexus/content/repositories/releases
</url>
</repository>
<snapshotRepository>
<id>nexusSnapshots
</id>
<name>Snapshots
</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots
</url>
</snapshotRepository>
</distributionManagement>
<!-- Content removed for brevity -->
</project>
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" ?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>nexusReleases
</id>
<username>deployment
</username>
<password>deployment123
</password>
</server>
<server>
<id>nexusSnapshots
</id>
<username>deployment
</username>
<password>deployment123
</password>
</server>
</servers>
</settings>
以下是与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
<project>
<modelVersion>4.0.0
</modelVersion>
<!-- Content removed for brevity -->
<scm>
<connection>scm:svn:http://localhost/svn/gswm/trunk
</connection>
<developerConnection>scm:svn:http://localhost/svn/gswm/trunk
</developerConnection>
<url>http://localhost/svn/gswm/trunk
</url>
</scm>
<!-- Content removed for brevity -->
</project>
在本地机器上更新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" ?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>nexusReleases
</id>
<username>deployment
</username>
<password>deployment123
</password>
</server>
<server>
<id>nexusSnapshots
</id>
<username>deployment
</username>
<password>deployment123
</password>
</server>
<server>
<id>localhost
</id>
<username>gswm
</username>
<password>gswm
</password>
</server>
</servers>
</settings>
现在,您具有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\<<USER_NAME>>\AppData\Local\Temp\maven-scm-203076178.commit --targets C:\Users\<<USER_NAME>>\AppData\Local\Temp\maven
scm-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\<<USER_NAME>>\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\<<USER_NAME>>\AppData\Local\Temp\maven-scm-112170711.commit --targets C:\Users\<<USER_NAME>>\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\<<USER_NAME>>\.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\<<USER_NAME>>\.m2\repository\com\apress\gswmbook\gswm\1.0.0\gswm-1.0.0.pom sources.jar to C:\Users\<<USER_NAME>>\.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\<<USER_NAME>>\.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的发布过程及其不同的阶段。