Maven中GeoTools的引入 - Maven 的 repository 与 mirror

2023-11-01

Maven中GeoTools的引入 - Maven 的 repository 与 mirror

在Maven中引入GeoTools时找不到jar包,搜索了蛮久才明白是自己maven没有学明白,于是重学了一次maven,解决了这个问题。关键在于理解maven中仓库(repository)与镜像(mirror)的关系与使用。

一、问题描述

起因是这样的,我想要引入GeoTools包,却发现即使按照官方quick start来操作,也没有引入成功,始终是找不到jar包,百思不得其解。

按照官网和谷歌百度搜索的结果看
要使用GeoTools,首先引入需要的GeoTools的模块。GeoTools有很多模块,如shapefile,csv等。
这个是我要引入的geojson模块

<dependency>
   <groupId>org.geotools</groupId>
   <artifactId>gt-geojson</artifactId>
   <version>19.0</version>
</dependency>

然后添加GeoTools官方的仓库

<repository>
   <id>osgeo</id>
   <name>OSGeo Release Repository</name>
   <url>https://repo.osgeo.org/repository/release/</url>
   <snapshots><enabled>false</enabled></snapshots>
   <releases><enabled>true</enabled></releases>
</repository>
<repository>
   <id>osgeo-snapshot</id>
   <name>OSGeo Snapshot Repository</name>
   <url>https://repo.osgeo.org/repository/snapshot/</url>
   <snapshots><enabled>true</enabled></snapshots>
   <releases><enabled>false</enabled></releases>
</repository>

但就是找不到jar包
在这里插入图片描述
dependencies也是报错
在这里插入图片描述

后来尝试将仓库以镜像的方式写入到settings.xml之中,结果发现可行了。(当然后续发现这种方法是错误的解决方案,正确的做法在后面)

二、原理说明

出错原因: 没有理解清楚maven的repository与mirror的关系,错误地将阿里云镜像的mirrorOf参数值设置为*(星号,通配符,表示匹配全部仓库)(正确的参数值为central)

为了让各位更好地理解这个问题,有必要占用一些篇幅介绍一下maven的基本信息和相关概念。

2.1 maven的主要功能

以下描述摘自维基百科:

Maven是一个主要用于Java项目的构建自动化工具。Maven还可以用来构建和管理使用c#、Ruby、Scala和其他语言编写的项目。Maven项目由Apache软件基金会托管,它以前是Jakarta项目的一部分。

Maven解决了构建软件的两个方面:如何构建软件及其依赖关系。

maven的主要功能有两个:一个是解决项目的构建:包括编译(build)测试(test)、**打包(package)部署(deploy)**等,maven使用生命周期的概念描述这一过程,并通过插件实现和控制项目构建各个阶段的执行。

下图为完整的maven生命周期
在这里插入图片描述
maven的另一个功能就是解决项目之间的依赖关系从仓库(repository)自动下载需要的jar包

maven使用项目对象模型(Project Object Model,POM)实现对项目的抽象和管理。

项目对象模型(POM)提供了单个项目的所有配置。一般配置包括项目的名称(name)、所有者(owner)及其对其他项目的依赖关系(dependencies)。还可以配置构建过程的各个阶段,这些阶段以插件(plugins)的形式实现。

默认情况下,所有的POM都继承自超级POM。超级POM提供默认配置,比如默认源目录、默认插件等等。

maven将约定大于配置作为其设计理念,约定了一些默认的配置,如项目的默认结构,对某个项目坐标、依赖和插件的规定的配置方法(IDE通常会帮助检查配置项的正确性)等。

下图表示默认的maven项目目录:
maven的默认配置

2.2 仓库

所有的maven项目都存储在服务器上,该服务器被抽象为仓库(repository),当用户需要某些jar包时就可以从仓库中下载。

maven通过超级POM机制配置了默认的仓库。由于所有的POM都隐式地继承自超级POM,超级仓库中配置了中央仓库,因此所有的项目默认配置了中央仓库

对于 Maven3,超级 POM 在文件 %MAVEN_HOME%/lib/maven-model-builder-x.x.x.jar 中的
org/apache/maven/model/pom-4.0.0.xml 路径下、

对于 Maven2,超级 POM 在文件 %MAVEN_HOME%/lib/maven-x.x.x-uber.jar 中的
org/apache/maven/project/pom-4.0.0.xml 目录下。

默认配置的部分内容如下:

  <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>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

我们可以自己添加仓库,如我添加了提供GeoTools相关包的仓库,id为osgeo,url地址为https://repo.osgeo.org/repository/release/

在项目的pom.xml中加入仓库配置:

<repository>
   <id>osgeo</id>
   <name>OSGeo Release Repository</name>
   <url>https://repo.osgeo.org/repository/release/</url>
   <snapshots><enabled>false</enabled></snapshots>
   <releases><enabled>true</enabled></releases>
</repository>

2.3 镜像

由于maven的中央仓库在国外,国内访问速度较慢,一般我们采用配置镜像(mirror)的方式从国内的镜像服务器中下载资源。

maven根据setting.xml文件中配置的镜像拦截发往原仓库的请求,并将其转发到镜像仓库。

即:当一个镜像的mirrodOf参数与某个仓库的id参数相匹配,就向该镜像请求资源,否则向原仓库请求资源。

阿里云镜像是常用的maven镜像之一,其镜像了中央仓库的所有资源。

setting.xml文件中阿里云镜像的配置如下:

<!-- 阿里云镜像 -->
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

setting.xml文件中,我们设置阿里云镜像的mirrorOf属性为central,以此去匹配id属性为central的中央仓库。这样所有对中央仓库发起的请求,都会被转发给阿里云镜像,大大提高了资源的下载速度。

2.4 仓库与镜像的关系

当我们配置了多个仓库多个镜像时,maven执行的策略为:

  1. maven根据镜像配置文件(setting.xml)自上至下地依次查看所有的镜像,对每一个仓库依次进行匹配,并使用第一个匹配上的镜像。被镜像匹配的仓库,仓库的url被替换为镜像的url,没有匹配的仓库,url不变。
  2. 查询各仓库是否包请求的资源(项目),如都没有,则报错(如未找到),否则从第一个匹配上的仓库拉取资源。
    在这里插入图片描述在这里插入图片描述

三、解决方案与小技巧

  1. 不是所有的jar包都被包含在maven中央仓库中,如果中央仓库没有该资源,就需要配置第三方仓库(也可以理解为别人的公开私服)。maven中央仓库不包含GeoTools的相关资源,因此需要单独配置OSGeo Release Repository仓库。
  2. 阿里镜像和清华镜像只提供对中央仓库的资源镜像mirrorOf属性的值只能设置为central不要设置为* 。如果设置为*,则所有仓库的url都会被替换,对于本文的情况,就是本来应当发往OSGeo Release Repository仓库的请求被发往阿里云镜像,而阿里云镜像不包含GeoTools的资源,自然是找不到了。正确的做法是每个镜像的mirrorOf属性应与该镜像对应的仓库的id属性保持一致。
  3. 还有一种骚操作(错误操作),就是在setting.xml将仓库作为镜像配置进去。由于maven的镜像机制,仓库的url会被替换为第一个匹配上的镜像,那么在阿里云镜像之前添加一个(伪)仓库镜像,也可以解决问题。但是这个方法肯定是错误用法(但是很骚)。

错误配置
setting.xml

<!-- 阿里云镜像 -->
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf> <!-- 正确的属性为central -->
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

或者

<!-- osgeo(伪)镜像 -->
<mirror>
    <id>mirror-osgeo</id>
    <mirrorOf>osgeo</mirrorOf>
    <name>Mirror Osgeo</name>
    <url>https://repo.osgeo.org/repository/release/</url>
</mirror>
<!-- 阿里云镜像 -->
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf> <!-- 正确的属性为central -->
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

pom.xml

<repository>
   <id>osgeo</id>
   <name>OSGeo Release Repository</name>
   <url>https://repo.osgeo.org/repository/release/</url>
   <snapshots><enabled>false</enabled></snapshots>
   <releases><enabled>true</enabled></releases>
</repository>

正确配置
setting.xml

<!-- 阿里云镜像 -->
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

pom.xml

<repository>
   <id>osgeo</id>
   <name>OSGeo Release Repository</name>
   <url>https://repo.osgeo.org/repository/release/</url>
   <snapshots><enabled>false</enabled></snapshots>
   <releases><enabled>true</enabled></releases>
</repository>

四、如何知道是否需要配置仓库?

在maven的官网可以查询相关项目的信息,项目页面的标签栏标识了存储了该项目的仓库,只要是存储在中央仓库的项目都会标识Central标签,此时就不用配置新的仓库。在这里插入图片描述
如果标签栏中没有标识Central仓库,说明中央仓库不包含该项目,需要配置新的仓库。
如对于GeoTools包,从图中我们可知,由于Central仓库不包含该包,我们就需要从其标签栏标识的GeoSolutions仓库、Geomajas仓库、Boundless仓库或OSGeo仓库拉取GeoTools包的资源。
在这里插入图片描述
参考资料:
https://en.wikipedia.org/wiki/Apache_Maven
https://www.cnblogs.com/shengulong/p/8295453.html maven的超级pom

如果这篇文章对你有用,可以点个赞再走哦~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven中GeoTools的引入 - Maven 的 repository 与 mirror 的相关文章

随机推荐

  • CUDA Vector Add Test 2048x1024

    1 include cuda runtime h CUDAVectorAdd cu 2 include device launch parameters h 3 include IML PrecisionTimer h 4 5 includ
  • 【笔记】Git及Github使用

    目录 Git概述及安装 Git常用命令 设置用户签名 姓名和邮箱地址 gitconfig 初始化本地库 查看本地库状态 本地文件添加到暂存区 提交本地库 形成历史版本 修改文件 历史版本信息 版本穿梭 回溯历史版本 查看当前本地库中所有文件
  • canvas清空画布方法

    1 最简单的方法 由于canvas每当高度或宽度被重设时 画布内容就会被清空 因此可以用以下方法清空 function clearCanvas span style font family none span var c document
  • mysql 存储引擎 原理_【MySQL—原理】体系结构和存储引擎

    在数据库领域中有两个词很容易混淆 这就是 数据库 database 和 实例 instance 作为常见的数据库术语 这两个词的定义如下 数据库 物理操作系统文件或其他形式文件类型的集合 实例 数据库管理程序 MySQL数据库由后台线程以及
  • 【狂神】MySQL - 连表查询 Join On 详解

    1 连表查询详解 市面上有 7 种连表查询 总共归为三大类 左查询 LEFT JOIN 以左表为基准 右查询 RIGHT JOIN 以右表为基准 交叉查询 INNER JOIN 查询两表都有的数据 操作 描述 inner join 如果表中
  • ajax嵌套的场景有哪些,ajax嵌套

    一 ajax嵌套ajax 传说中的嵌套金字塔 以及这种方式只能串联发起ajax请求 function getDataFun ajax url equip rank type GET dataType jsonp success functi
  • Qt之键盘事件无法响应问题

    Qt之键盘事件无法响应问题 概述 代码 over 文末一句话 概述 新公司的加班第一天 在调试公司项目代码时发现个小问题 鼠标 键盘事件都已写好 但是键盘事件无效无法进入断点 接来下去查文档并没有查到相关说明 翻阅百度翻到如下代码 并进行测
  • 配置文件文档

    Tranquilpeak Version 0 5 3 BETA Author Thibaud Lepr tre I STRONGLY recommend you to use a CDN to speed up loading of pag
  • Linux驱动入门(6.1)LED驱动---设备树

    前言 1 在韦东山Linux驱动入门实验班 5 LED驱动 驱动分层和分离 平台总线模型我们已经讲解了如何将驱动程序和硬件程序进行剥离 但是大佬们感觉这样还不行 他们认为要专门弄一个结构存储硬件信息 而不是用c文件存储 于是 大佬们就发明了
  • 数据结构-后序中序

    PTA 后序中序遍历给出先序结果 根据要求给定一棵二叉树的后序遍历和中序遍历结果 输出该树的先序遍历结果 输入格式 positive integer N lt 30 表示树中节点的个数 随之而来的是两行遍历序列 分别对应后序遍历和中序遍历结
  • 手把手教你ubuntu下移植MJPG-streamer

    一 嵌入式视频图像开源库 在嵌入式系统中 常用的视频图像处理开源系统有 luvcview cheese motion mjpg streamer或者ffmpeg 其中 luvcview 基于V4L2 SDL的程序 支持拍照录像 参数调节 代
  • Linux centos 卸载 ceph

    在CentOS上卸载Ceph的操作步骤 1 停止Ceph集群 首先 你需要停止Ceph集群中的所有服务 在每个节点上运行以下命令来停止所有服务 systemctl stop ceph target 2 卸载Ceph软件包 在每个节点上 使用
  • 在1-100中随机生成10个数字并进行排序

    1 生成10以内的数字 可以参考rand 10 2 生成1 10之间的数字 可以参考rand 10 1 3 特定的 要生成a b之间的数字 可以参考rand b a 1 a include
  • CSharp: QuestPDF create pdf file in donet core 6

  • UE4 分屏显示

    比较简单 直接附上蓝图 注意 启动模式选择独立游戏进程启动这样能够在两个屏幕上满屏显示 在UE4 版本上可以实现 不清楚在UE5上实现不了在两个屏幕上满屏显示 有疑惑或者想法这欢迎沟通交流 还要注意设置项目里面的屏幕设置 下面附上简单的分屏
  • js如何实现数组去重的常用方法

    聚沙成塔 每天进步一点点 专栏简介 使用 Set ES6 使用 filter 和 indexOf 使用 reduce 使用对象属性 使用 includes 方法 ES6 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上
  • 有人知道乐高机器人和乐高少儿编程区别吗

    乐高机器人和乐高少儿编程区别 现在很多的家长对于孩子的学习可以说是非常的用心 就拿现在很多的家长在给孩子选择少儿编程的学习课程的时候 可以说是非常的用心 就想要给孩子选择一个对于孩子有好处的课程 但是很多的家长对于乐高机器人和少儿编程的了解
  • 老猿学5G:融合计费的Nchf和Nchf‘服务化接口消息Nchf_ConvergedCharging_Create、Update、Release和Notify

    老猿Python博文目录 一 引言 在 老猿学5G扫盲贴 中国移动的5G计费架构解读 介绍了5G融合计费的服务化接口包括 CHF提供给CTF使用的Nchf接口 OCF提供给CHF使用的Nchf 接口 这两个接口消息的内容都相同 只是服务端和
  • 安卓端自行实现工信部要求的隐私合规检测一(教你手写Xposed模块代码)

    前言 原文地址 安卓端自行实现工信部要求的隐私合规检测一 教你手写Xposed模块代码 转载者言 只是简单监控隐私权限可以使用Android 11的新特性AppOpsManager OnOpNotedCallback 参考下面文章 隐私合规
  • Maven中GeoTools的引入 - Maven 的 repository 与 mirror

    Maven中GeoTools的引入 Maven 的 repository 与 mirror 在Maven中引入GeoTools时找不到jar包 搜索了蛮久才明白是自己maven没有学明白 于是重学了一次maven 解决了这个问题 关键在于理