关于Maven混合配置私有仓库和公共仓库的问题

目录
  • 背景
  • 私有和公共仓库混合配置
    • Maven仓库
    • 解决步骤
      • 一、验证私有仓库
      • 二、搜索共有仓库
      • 三、搜索第三方仓库
      • 四、maven配置
    • mirror
    • profile
    • activeProfile
  • 配置结果
    • setting.xml完整配置
  • 结论

背景

近期在调研一个开源仓库,于是将 代码从github下载后,当IDEA sync依赖时出现Cannot resolve org.fourthline.cling:cling-support:2.1.1 的问题,详情如下:

Cannot resolve org.fourthline.cling:cling-support:2.1.1
Clean up the broken artifacts data (.lastUpdated files) and reload the project.
Cannot resolve org.fourthline.cling:cling-core:2.1.1
Clean up the broken artifacts data (.lastUpdated files) and reload the project.

很明显这个问题是Maven仓库找不到需要的jar包。那么如何解决这个问题呢?

私有和公共仓库混合配置

Maven仓库

首先,需要知道Maven仓库分为私有仓库、公有仓库、第三方仓库。其中:

  • 私有仓库:一般是公司或个人自己搭建的仓库。
  • 公共仓库

    首选是Maven官方的仓库,地址:repo1.maven.org/maven2/

    官方仓库在国内访问极慢,因此国内一般会使用阿里云仓库替代,地址:maven.aliyun.com/nexus/conte…

  • 第三方仓库:一些个人、团体、公司开放的仓库,仓库中的jar包并没有发布到公共仓库中。

熟悉仓库的分类对于解决上文中遇到的问题有这个重要的作用。

解决步骤

一、验证私有仓库

遇到依赖缺失的问题后,首先需要确认私有仓库是否存在依赖,查看nexus发现并没有需要的依赖,可以断定私有仓库没有此依赖。

二、搜索共有仓库

Maven官方的仓库提供了Web搜索页面,地址:repo1.maven.org/maven2/,尝试搜索后发现也没有需要的依赖。如下:

三、搜索第三方仓库

经过以上搜索后,可以断定 代码需要的依赖,一定是由第三方仓库提供的。如何找到是在哪个第三方仓库呢?

此时,就需要mvnrepository来提供帮助了,地址:mvnrepository.com/mvnrepository提供了公共仓库和第三方仓库中jar包的索引、查询、下载等实用功能。

我们尝试搜索需要的依赖, mvnrepository.com/artifact/or…,结果如下图:

可以看到在mvnrepository中找到了需要的依赖。那么问题来,如何知道第三方仓库的地址呢?可以详细看上图中箭头指向的区域,这里展示了第三方仓库的maven url。

在实践中,完全可以跳过搜索公共仓库,因为mvnrepository已经包含了公共仓库的依赖。

四、maven配置

maven仓库的配置是在setting.xml配置的。如果要混合配置私有仓库和公共仓库,需要在setting.xml增加新的mirrorprofile,并激活新的activeProfile

mirror

setting.xmlmirrors节点,是用来配置镜像URL的。mirrors可以配置多个mirror,每个mirrorid,name,url,mirrorOf属性,详细解释如下:

  • id是唯一标识一个mirror
  • name貌似没多大用,相当于描述
  • url是官方的库地址
  • mirrorOf代表了一个镜像的替代位置,其中,
    • *: 匹配所有,所有内容都从镜像拉取;
    • external:*: 除了本地缓存的所有从镜像仓库拉取;
    • repo,repo1: repo或者repo1,这里的repo指的仓库ID;
    • *,!repo1: 除了repo1的所有仓库;

我们这次需要添加的mirror如下:

<mirror>
	<id>nexus-4thline</id>
	<mirrorOf>4thline</mirrorOf>
	<name>4thline nexus</name>
	<url>http://4thline.org/m2/</url>
</mirror>

这里又产生了一个问题,配置了多个mirror,Maven如何排序?答案是,Maven并不是按照setting.xml中配置的顺序执行,而是根据字母排序来指定第一个,然后会遍历所有的仓库,直至找到需要的依赖。

profile

作用:根据环境参数来调整构建配置的列表,settings.xml中的profile元素是pom.xmlprofile元素的裁剪版本

  • id:profile的唯一标识
  • activation:自动触发profile的条件逻辑
  • repositories:远程仓库列表
  • pluginRepositories:插件仓库列表
  • properties:扩展属性列表

这里的profile元素只包含这五个子元素是因为这里只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings.xml中的profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile

我们这次需要添加的profile如下:

<profile>
  <id>4thline</id>
  <repositories>
	<repository>
	  <id>4thline</id>
	  <url>http://4thline.org/m2/</url>
	  <releases>
		<enabled>true</enabled>
	  </releases>
	  <snapshots>
		<enabled>true</enabled>
		<updatePolicy>always</updatePolicy>
	  </snapshots>
	</repository>
  </repositories>
</profile>

activeProfile

作用:手动激活profiles的列表,按照profile被应用的顺序定义activeProfile

该元素包含了一组activeProfile元素,每个activeProfile都含有一个profile id。任何在activeProfile中定义的profile id,不论环境设置如何,其对应的 profile都会被激活。如果没有匹配的profile,则什么都不会发生。

我们这次需要添加的activeProfile如下:

<activeProfiles>
	<activeProfile>corp</activeProfile>
	<activeProfile>aliyun</activeProfile>
	<activeProfile>4thline</activeProfile>
</activeProfiles>

配置结果

经过上述配置后,首先我们可以在IDEA的Maven侧边栏中,可以看到多了4thlineprofile。(可以看到IDEA的profiles是按照首字母排序的,和上文中mirror的定义是一致的。)

重新执行Reload All Maven Projects,所有的依赖都正常import。

setting.xml完整配置

完整版的setting.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">
	<localRepository>D:\Users\xxx\.m2\repository\</localRepository>
	<pluginGroups>
	</pluginGroups>
	<mirrors>
		<mirror>
		  <id>nexus</id>
		  <mirrorOf>corp</mirrorOf>
		  <name>corp nexus</name>
		  <url>http://maven.corp.com/nexus/content/groups/public</url>
		</mirror>
		<mirror>
			<id>nexus-aliyun</id>
			<mirrorOf>*</mirrorOf>
			<name>aliyun nexus</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public</url>
		</mirror>
		<mirror>
			<id>nexus-4thline</id>
			<mirrorOf>4thline</mirrorOf>
			<name>4thline nexus</name>
			<url>http://4thline.org/m2/</url>
		</mirror>
	</mirrors>
	<servers>
		<server>
			<id>releases</id>
			<username>xxx</username>
			<password>yyy</password>
		</server>
		<server>
			<id>snapshots</id>
			<username>xxx</username>
			<password>yyy</password>
		</server>
	</servers>
	<profiles xmlns="">
		<profile>
			<id>corp</id>
			<repositories>
				<repository>
				  <id>public</id>
				  <name>all repoes</name>
				  <url>http://maven.corp.com/nexus/content/groups/public</url>
				  <releases>
					<enabled>true</enabled>
					<checksumPolicy>warn</checksumPolicy>
				  </releases>
				  <snapshots>
					 <enabled>true</enabled>
					 <updatePolicy>always</updatePolicy>
					 <checksumPolicy>fail</checksumPolicy>
				  </snapshots>
				</repository>
			</repositories>
			<pluginRepositories>
				<pluginRepository>
					<id>corp</id>
					<url>http://maven.corp.com/nexus/content/groups/public</url>
					<releases>
						<enabled>true</enabled>
						<checksumPolicy>warn</checksumPolicy>
					</releases>
					<snapshots>
						<enabled>true</enabled>
						<updatePolicy>always</updatePolicy>
						<checksumPolicy>fail</checksumPolicy>
					</snapshots>
				</pluginRepository>
			</pluginRepositories>
		</profile>
		<profile>
		  <id>aliyun</id>
		  <repositories>
			<repository>
			  <id>aliyun</id>
			  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
			  <releases>
				<enabled>true</enabled>
			  </releases>
			  <snapshots>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			  </snapshots>
			</repository>
		  </repositories>
		</profile>
		<profile>
		  <id>4thline</id>
		  <repositories>
			<repository>
			  <id>4thline</id>
			  <url>http://4thline.org/m2/</url>
			  <releases>
				<enabled>true</enabled>
			  </releases>
			  <snapshots>
				<enabled>true</enabled>
				<updatePolicy>always</updatePolicy>
			  </snapshots>
			</repository>
		  </repositories>
		</profile>
	</profiles>
  	<activeProfiles>
		<activeProfile>corp</activeProfile>
		<activeProfile>aliyun</activeProfile>
		<activeProfile>4thline</activeProfile>
	</activeProfiles>
</settings>

结论

Maven是每一个Java程序员都再熟悉不过的工具,但是我们真的了解它吗?

任何一个优秀的框架、组件、工具,除了特殊的另外的特殊优化外,很多时候设计思路是大体相同的,我们在实际工作中不仅仅要扩展自己的涉猎领域,更需要在某些领域深入进入,对个人的提升是更为有益处的。

到此这篇关于Maven混合配置私有仓库和公共仓库的文章就介绍到这了,更多相关Maven配置私有仓库和公共仓库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用Docker搭建Nexus私有仓库实现Maven私服

    目录 一.前言 二.Nexus搭建 三.配置仓库 3.1 配置加速库 3.2 创建私有仓库 四.配置权限 五.上传Jar包 六.使用Jar包 一.前言 相信国内的小伙伴都经历过,Gradle.Maven.NPM下拉速度过慢的情况.我们一般的做法是配置阿里云这样的中央仓库.加速问题是可以采用这种方式解决,但如果是团队内部的库想进行上传分发,传到Maven Central这种共用的Maven仓库就不太合适了.那样保密性和时效性都将收到破坏.所以在团队内部,我们一般都会搭建局域网内私有的中央仓库.支撑

  • docker-maven-plugin打包镜像并上传到私有仓库

    目录 1.docker-maven-plugin 介绍 2.环境.软件准备 3.Demo 示例 3.1 配置 DOCKER_HOST 3.2 示例构建镜像 3.3 执行命令 3.4 绑定Docker 命令到 Maven 各个阶段 3.5 使用私有 Docker 仓库地址 3.6 安全认证配置 3.7 其他参数 4.FAQ 1.docker-maven-plugin 介绍 在我们持续集成过程中,项目工程一般使用 Maven 编译打包,然后生成镜像,通过镜像上线,能够大大提供上线效率,同时能够快速动

  • maven项目打包上传到私有仓库

    目录 1. 背景 2. 步骤 2.1 修改pom.xml 2.2 命令执行 2.3 成功后的依赖 3. 扩展 1. 背景   最近有些自己制作的工具包,需要单独抽取出来之后,在打包的时候,同时上传到自己的maven私服仓库,供别人引用,并且还能够引用的时候看到源码.但是,在上传的过程中总是失败不成功,特别上火.最后总算成功,记录下步骤,希望能够帮助到需要的人. 2. 步骤   先说下我的要求: 本地打包能够自动上传maven私服仓库. 别人引用后,能够看到源码及注释. 2.1 修改pom.xml

  • Java Maven settings.xml中私有仓库配置详解

    目录 Maven setting中私有仓库配置浅析 简单maven配置 mirrors profile repositories 总结 Maven setting中私有仓库配置浅析 最近遇到过不少这样那样的问题,曾经做过maven的分享,但是发现当时部分内容还是太想当然了,下面经过尝试后简单总结下: 首先几个逻辑: pom>启用的profile>maven原有配置 mirror配置mirrorOf和id匹配优先 简单maven配置 一般大家的配置(略去无关私有仓库配置)都是这样的 <mi

  • 关于Maven混合配置私有仓库和公共仓库的问题

    目录 背景 私有和公共仓库混合配置 Maven仓库 解决步骤 一.验证私有仓库 二.搜索共有仓库 三.搜索第三方仓库 四.maven配置 mirror profile activeProfile 配置结果 setting.xml完整配置 结论 背景 近期在调研一个开源仓库,于是将 代码从github下载后,当IDEA sync依赖时出现Cannot resolve org.fourthline.cling:cling-support:2.1.1 的问题,详情如下: Cannot resolve

  • Docker 教程之私有仓库详解

    私有仓库 有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用. 本节介绍如何使用本地仓库. docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库. 安装运行 docker-registry 容器运行 在安装了 Docker 后,可以通过获取官方 registry 镜像来运行. $ sudo docker run -d -p 5000:5000 registry 这将使用官方的 registry 镜像来启动本地的私有仓库. 用户可

  • Docker上传镜像至私有仓库的方法示例

    镜像可以很方便直接 push 到 docker 的公共仓库,就好像 github 一样,但是我们在开发中很多时候都不想公开镜像文件,这时就需要搭建 docker 的私有仓库,就好像 gitlab 一样. 在 上一篇 构建出镜像后,我们可以部署一个私有镜像仓库用来存放我们的镜像. 启动私有 Registry 启动一个私有仓库也非常简单,在服务器上执行命令 复制代码 代码如下: docker run -d -p 5000:5000 --name="docker-registry" --re

  • Docker搭建私有仓库(registry与Harbor)的实现

    随着docker使用的镜像越来越多,就需要有一个保存镜像的地方,这就是仓库.目前常用的两种仓库:公共仓库和私有仓库.最方便的就是使用公共仓库上传和下载,下载公共仓库的镜像是不需要注册的,但是上传时,是需要注册的. 私有仓库最常用的就是registry.Harbor两种,那接下来详细介绍如何创建私有仓库. 一.搭建registry私有仓库 1)案例描述 两台docker服务器,dockerA创建registry私有仓库,dockerB用于测试! 2)案例实例 (1)DockerA服务器的操作 [r

  • Docker私有仓库Registry部署的实现

    随着docker使用的镜像越来越多,就需要有一个保存镜像的地方,这就是仓库.目前常用的两种仓库:公共仓库和私有仓库.最方便的就是使用公共仓库上传和下载,下载公共仓库的镜像是不需要注册的,但是上传时,是需要注册的. 私有仓库最常用的就是Registry.Harbor两种,那接下来详细介绍如何搭建registry私有仓库,Harbor将在下一篇博文部署. 一.部署Registry私有仓库 案例描述 两台CentOS7.4,一台为Docker私有仓库:另一台为Docker客户端,测试使用: 两台服务器

  • 详解maven配置多仓库的方法示例

    刚接触maven就是在公司里配置好的,所以一直以来使用都没毛病,所以一直没有去动这些固有的东西. 但是,后来把公司的电脑拿回家之后,发现有的东西就搞不起来了.原因也看一下就明白了,因为在公司的时候用的是公司的maven私服,所以回家后,用不了也是正常. 但是,真的脱离了公司,自己就不能工作了吗?不可能吧. 难道一下开源工具都必须要依赖于公司的网络? 这明显是不合理的. 那么,就扯出本次文章的意义了,在家里,自然是要公有的maven仓库了,那么,怎样配置maven仓库才能让自己用起来顺心呢? 1.

  • Maven配置多仓库无效的解决

    在项目中使用Maven管理jar包依赖,往往会出现以下状况: 1.国内访问maven默认远程中央镜像特别慢: 2.使用阿里的镜像替代远程中央镜像: 3.阿里云镜像中缺少部分jar包: 4.同时使用私有仓库和公有仓库: 针对以上情况,我们就需要让Maven支持多仓库配置. 单独仓库配置 当只配置一个仓库时,操作比较简单,直接在Maven的settings.xml文件中进行全局配置即可,以阿里云的镜像为例: <mirrors> <mirror> <id>alimaven&l

随机推荐