Maven仓库与Maven私服架构

Maven

Maven仓库

Maven仓库概念:用来统一存储所有Maven共享构建的位置就是仓库

在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件,Maven 仓库能帮助我们管理构件,它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

Maven仓库布局:

根据Maven坐标定义每个构建在仓库中唯一存储路径,采用层级目录存储,例如:

依赖 org.springframework:spring-core:5.3.20 在本地仓库中的路径为:org/springframework/spring-core/5.3.20/

仓库的分类

运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。

Maven本地仓库配置

  1. 全局本地仓库(所有操作系统用户均影响)
    settings.xml 存放路径为 %MAVEN_HOME%\conf\settings.xml,本地仓库路径对操作系统中所有用户生效,任何用户执行 Maven 命令都会使用该配置,修改该文件会影响所有使用该Maven的用户的本地仓库。
  2. 用户本地仓库(仅影响使用该配置文件的用户或程序)
    settings.xml 存放路径为 用户目录/.m2/settings.xml,本地仓库路径仅对当前操作系统用户生效,其他用户登录系统后使用自己的默认或自定义配置,该文件可以在任意目录。

修改配置文件设置Maven本地仓库(以全局设置为例),编辑 D:\installation\apache-maven-3.6.0\conf 文件

Maven私服架构

maven私服介绍

公司在自己的局域网内搭建自己的远程仓库服务器,称为私服, 私服服务器即是公司内部的 maven 远程仓库, 每个员工的电脑上安装 maven 软件并且连接私服服务器,员工将自己开发的项目打成 jar 并发布到私服服务器,其它项目组从私服服务器下载所依赖的构件(jar)。

私服还充当一个代理服务器,当私服上没有 jar 包会从互联网中央仓库自动下载。

Nexus介绍

Nexus 是 Maven 仓库管理器, 通过 nexus 可以搭建 maven 仓库,同时 nexus 还提供强大的仓库管理功能,构件搜索功能等。

Maven私服构建

nexus安装

解压 nexus-2.12.0-01-bundle.zip 文件,存放到一个不含中文的目录下,查看conf文件下的nexus.properties配置文件,可以修改对应的配置

application-port 表示该 Nexus 应用程序将使用 8081 端口监听客户端的访问请求;

保证端口号不被其他程序占用,nexus-webapp定义NexusWeb应用的根目录路径;

nexus-webapp-context-path=/nexus 设置 Web 应用的路径,是 URL 中用于区分不同 Web 应用的路径片段,这里配置为/nexus意味着访问 Nexus 的完整基础 URL 为http://服务器IP:8081/nexus。

nexus的安装命令:使用管理员运行cmd命令窗口,切换目录nexus\nexus-2.12.0-01\bin目录下,执行 nexus.bat install 进行安装。执行 nexus.bat start 启动服务,执行 nexus.bat stop 停止服务。

补充nexus的卸载命令:使用管理员运行cmd命令窗口,切换目录nexus\nexus-2.12.0-01\bin目录下,执行nexus.bat uninstall进行卸载

访问图形化界面:打开浏览器,输入http://localhost:端口号/nexus访问

点击log in,进行登录。默认用户名:admin,默认密码:admin123

nexus仓库类型

nexus提供了不同的仓库类型

  • hosted,宿主仓库, 部署自己的 jar 到这个类型的仓库,包括 releases、snapshot、3rd party 三部分, Releases 公司内部发布版本仓库,Snapshots 公司内部测试版本仓库,3rd Party 是第三方仓库用于存储非本团队开发的依赖,需手动上传到 Hosted 仓库统一管理。
  • proxy,代理仓库, 用于代理远程的公共仓库,如 maven 中央仓库,用户连接私服,私服自动去中央仓库下载 jar 包或者插件。
  • group,仓库组,将多个不同类型的仓库合并成一个统一的访问地址,简化依赖获取流程。当项目请求依赖时,它会按预设顺序从包含的仓库中查找,找到后返回给项目,无需项目逐个配置多个仓库地址。通常我们配置自己的 maven 连接仓库组,Group仓库组也是可以自己进行定制的。
  • virtual(虚拟):兼容 Maven1 版本的 jar 或者插件。

将项目发布到私服

需要在客户端即部署要部署的工程电脑上配置 maven 环境,并修改 settings.xml 文件, 配置连接私服的用户和密码 。此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码是否和私服中的账号和密码一致。

在 settings.xml 文件的 servers 节点下进行配置,定义稳定版本的id名称和开发版本的id名称,用户名密码,id必须要和私服宿主库的名字一致

xml 复制代码
	<server>
      <id>releases</id>
      <username>admin</username>
      <password>admin123</password>
	</server>
	<server>
      <id>snapshots</id>
      <username>admin</username>
      <password>admin123</password>
   </server>

配置项目 pom.xml,配置私服仓库的地址,本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为 release 则上传到私服的 release 仓库,如果版本为snapshot 则上传到私服的 snapshot 仓库。

xml 复制代码
<distributionManagement>
    <repository>
        <id>releases</id>
        <url>http://localhost:8081/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>

注意:这里的 id 标签的值要和 settings.xml配置文件中的id值保持一致,distributionManagement 标签与 dependencies 标签是同级标签,这里的 url 地址来自于私服仓库的 Repository Path。

在该工程中执行 deploy 命令,发布项目到私服上,如图成功。

从私服下载jar包

第一种方式

全局配置

修改 Maven 安装目录下的 conf/settings.xml,或用户目录下的 .m2/settings.xml,在 mirrors 标签中配置私服的镜像文件

xml 复制代码
	<mirror>
		<id>nexusmaven</id>
		<mirrorOf>*</mirrorOf>  
		<name>nexus maven</name>
		<url>http://localhost:8081/nexus/content/groups/public/</url>      
	</mirror>

id 是镜像的唯一标识;mirrorOf 是镜像要替代的仓库范围,* 表示拦截所有的请求都重定向到私服,从私服下载jar包,私服没有再去中央仓库下载;url 是镜像仓库的实际地址。

先把自己的某个项目发布到私服中,然后删除掉本地仓库中的 jar 包,再使用其他项目去依赖该 jar 包,查看是否从私服中下载。

第二种方式

项目级配置

修改项目的pom配置文件,添加仓库的配置:

xml 复制代码
<repositories>
    <repository>
        <id>nexus</id>
        <name>nexusmaven</name>
        <url>http://localhost:8081/nexus/content/groups/public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>public</id>
        <url>http://localhost:8081/nexus/content/groups/public/</url>
        <name>pluginRepositories</name>
    </pluginRepository>
</pluginRepositories>

repositories 标签用于配置依赖包仓库,pluginRepositories 标签用于配置插件仓库

第三种方式

在settings.xml配置文件中添加配置,完成统一的设置

xml 复制代码
	<profile> 
		<id>dev</id>
		<repositories>
			<repository>
				<id>nexus</id>
				<url>http://localhost:8081/nexus/content/groups/public/</url>
				<releases>
					<enabled>true</enabled>
				</releases>
				<snapshots>
					<enabled>true</enabled>
				</snapshots>
			</repository>
		</repositories>
		<pluginRepositories>
			<pluginRepository>
				<id>public</id>
				<name>Public Repositories</name>
				<url>http://localhost:8081/nexus/content/groups/public/</url>
			</pluginRepository>
		</pluginRepositories>
	</profile>

profile 是 Maven 中用于环境隔离的配置单元,,它允许定义不同环境的专属配置,需要时通过激活使其生效,不激活则不生效。<id>dev</id> 表示这个 Profile 的唯一标识是 dev,方便后续通过 id 激活。

激活配置

xml 复制代码
  <activeProfiles>
		<activeProfile>dev</activeProfile>
	</activeProfiles>

第三方jar包发布到私服

先在settings.xml配置文件中配置用户名密码,加上第三方仓库的认证权限

xml 复制代码
	<server>
		<id>thirdparty</id>
		<username>admin</username>
		<password>admin123</password>
	</server>

上传到私服命令:

mvn deploy:deploy-file -DgroupId=junit -DartifactId=junit -Dversion=4.9 -Dpackaging=jar -Dfile=junit-4.9.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty

上传效果: