Maven私服的使用实战
- 将内部构件部署到私服仓库
- 什么是仓库和仓库组
- 远程仓库的定义
- 仓库定义基本结构
- 仓库结构的属性介绍
- 部署部件到远程仓库
- 远程仓库的认证
- 用户名+密码认证
- 案例参考
- 私钥进行鉴权
- 镜像mirror
- 镜像仓库的工作原理
将内部构件部署到私服仓库
如果想先学好什么如何将内部构件部署到私服仓库,那么首先需要先了解什么是仓库和仓库组。
什么是仓库和仓库组
-
仓库(repository)的概念实际上是一个用于存储和分发构件(artifact,如JAR、WAR、pom.xml文件等)的服务器。仓库的URL用于指向这个仓库,以便Maven客户端可以从中下载所需的构件。此外,多个仓库还是可以组成仓库组,那么什么是仓库组?
-
仓库组(repository group)是Nexus Repository Manager等工具引入的一个概念,它本质上是将多个仓库的URL地址合并成一个新的URL。当Maven客户端要从这个仓库组的URL下载某个构件时,系统会在仓库组包含的所有仓库中搜索,这一操作称为仓库路由。它可以大大提高工作效率,因为你不再需要单独地在所有的仓库中搜寻。
远程仓库的定义
仓库的URL可以指向仓库组。仓库组将多个仓库集合在一起,当指向仓库组时,实际上是从仓库组中下载所有仓库的构件。
<repositories><repository><id>central</id><name>Central Repository</name><url>https://repo.maven.apache.org/maven2</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository>
</repositories>
仓库定义基本结构
<repositories>
元素中定义了一个名为central的仓库,其URL为"https://repo.maven.apache.org/maven2"。<layout>
元素指明了这个仓库使用的结构是Maven默认的结构,即artifact在仓库中的存储路径会按照artifact的groupId、artifactId和version信息来组织。<snapshots>
元素表明这个仓库不接受snapshot版本的构件,snapshot版本通常用于开发过程中的临时版本。只有一个release版本的构件才能被放入这个仓库。
包含这段配置的文件是所有Maven项目都会继承的超级POM,开发者也可以自己定义远程仓库,假如要将默认的远程仓库设置为Wizard,在模块的POM文件中,作如下定义:
<repositories><repository><id>wizard</id><name>Wizard Repository</name><url>http://repository.wizard.com/maven2/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots><layout>default</layout></repository>
</repositories>
仓库结构的属性介绍
-
releases和snapshots:它们用来控制Maven对于发布版构件和快照版构件的下载。除了enabled,还有updatePolicy和checksumPolicy两个属性。
-
updatePolicy:表示从远程仓库检查更新的频率,默认是daily每天检查一次。
- never:从不
- always:每次构建都检查
- inverval X :每隔X分钟检查一次,X为任意正整数。
-
checksumPolicy:表示检查检验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的校验和文件。在下载构件时,Maven会验证校验和文件,如果失败,怎么办?当该值为默认的warn时,只会输出警告信息。其他值:fail 构建失败 ignore 忽略错误信息
部署部件到远程仓库
如果您想将构件部署到私服,可以使用Maven的deploy
命令。为了配置部署相关信息,您需要在项目的pom.xml
文件中添加distributionManagement
标签。
在pom.xml
文件中,distributionManagement
标签用于配置构件的部署目标。您可以指定私服的URL、认证信息以及其他相关配置,以下是一个示例的distributionManagement
配置:
<repository><id>my-repo</id><url>https://example.com/repository</url><uniqueVersion>false</uniqueVersion></repository>
</distributionManagement>
在上述示例中,repository
标签指定了私服的唯一标识符(id
)和URL(url
)。您可以根据实际情况修改这些值。
通过配置distributionManagement
标签,您可以告诉Maven将构件部署到指定的私服。在执行deploy
命令时,Maven将使用配置的URL和认证信息将构件上传到私服。这种配置方式使得构件的部署变得简单和自动化,确保构件能够被正确地发布到私服中,供其他项目使用。
<distributionManagement><repository><id>myrelease</id><name>my release repo</name><url>http://localhost:8081/nexus/content/repositories/releases/</url></repository><snapshotRepository><id>mysnapshot</id><name>my snapshot repo</name><url>http://localhost:8081/nexus/content/repositories/snapshots/</url></snapshotRepository>
</distributionManagement>
在工程的pom文件中添加下面配置
<distributionManagement><repository><id>myrelease</id><name>my release repo</name><url>http://ip:8081/nexus/content/repositories/releases/</url></repository><snapshotRepository><id>mysnapshot</id><name>my snapshot repo</name><url>http://ip:8081/nexus/content/repositories/snapshots/</url></snapshotRepository>
</distributionManagement>
远程仓库的认证
当需要进行鉴权时,可以在Maven的settings.xml文件中配置server节点,并提供相应的用户名和密码,或者私钥。在Maven的settings.xml文件中,server节点用于配置与仓库的鉴权信息。每个server节点对应一个仓库,可以配置该仓库的认证信息
用户名+密码认证
如果您需要进行身份验证,请在settings.xml文件中添加以下servers节点,并配置用户名和密码,如下所示的结构:
<server><id>{POM文件/Setting文件中定义的远程仓库ID}</id><username>{账号用户名}</username><password>{账号密码}</password>
</server>
在上述示例中,server节点的id指定了仓库的唯一标识符,username和password分别指定了用于鉴权的用户名和密码。
案例参考
作为一个搭配使用可以看一下认证鉴权和仓库的对应关系和匹配关系,如下所示。
<repositories><repository><id>wizard</id><name>Wizard Repository</name><url>http://repository.wizard.com/maven2/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots><layout>default</layout></repository>
</repositories>
<!--配置一些仓库的鉴权信息 -->
<server><id>wizard</id><username>root</username><password>qwe!@#</password>
</server>
私钥进行鉴权
如果使用私钥进行鉴权,可以使用privateKey
元素来配置私钥的路径和密码,通过在settings.xml
中配置server
节点,并提供相应的鉴权信息,Maven在与仓库进行交互时将使用这些信息进行认证,确保只有经过授权的用户才能访问仓库。
<servers><server><id>{POM文件/Setting文件中定义的远程仓库ID}</id><privateKey>/path/to/private-key</privateKey><passphrase>your-passphrase</passphrase></server></servers>
</settings>
在上述示例中,privateKey
指定了私钥文件的路径,passphrase
指定了私钥的密码(如果有的话)。
镜像mirror
如果仓库X可以提供仓库Y存储的所有内容,我们可以将X视为Y的一个镜像。镜像仓库的存在是为了解决地理位置的限制,有时候镜像仓库可以提供比中央仓库更快的服务。
镜像仓库的工作原理
当开发人员从仓库Y请求某个依赖项时,镜像仓库X会先检查自己的存储中是否有该依赖项的副本。如果有,镜像仓库X会立即返回该依赖项,而不需要从仓库Y下载。这样可以节省时间和带宽,提供更快的服务。
镜像仓库的设置通常在项目的构建工具(如Maven)的配置文件中进行。通过配置镜像仓库,开发人员可以选择从镜像仓库获取依赖项,而不是直接从中央仓库下载。这样可以加快构建过程,并提高开发效率。
例如,http://maven.net.cn/content/groups/public/,http://repo1.maven.org/maven2
在中国的镜像,当然跑得比西方快,所以可以用它来替代中央仓库,在settings.xml文件中设置如下配置即可
<mirror><id>myMirror</id><!-- 将所有的下载请求统一路由到私服,限制在线下载--><mirrorOf>*</mirrorOf><!-- 这里可以填写仓库id,或者*表示所有仓库 --><url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
强制将所有对下载构件的请求,重定位到镜像的路径。这样可以限制项目只从私服上下载构件,从而达到对三方件的控制(在大公司尤为重要,因为涉及到安全问题)