基于JDK1.8和Maven的GeoTools 28.X源码自主构建实践

news2024/11/13 15:25:56

目录

前言

一、GeoTools与Jdk的版本关系

1、GeoTools与Jdk版本

2、编译环境简介

二、使用Maven编译GeoTools28.X

1、GeoTools28.x

2、Maven的完整编译

3、构建时的问题

三、总结


前言

        想要学习和掌握一个开源软件或者项目,源码是我们主要学习的内容。学习开源项目的源代码可以帮助我们提高编程技能、理解新技术,并可能为这些项目作出贡献。以下是一些建议,帮助初学者更高效地学习开源项目的源代码:首先选择合适的项目:挑选一个你感兴趣的项目,最好是使用你熟悉的编程语言和技术栈。第二步阅读文档:查阅项目的 README 文件、官方文档、Wiki 等,了解项目的背景、目标、功能和用途。第三步环境搭建:根据项目的文档,搭建本地开发环境,确保能成功编译和运行项目。第四步理解代码结构:浏览项目的目录结构,了解其组织方式,识别主要的模块和组件。第五步阅读核心代码:深入阅读核心功能的代码,了解关键算法和数据结构。可以从项目的入口点(例如 main 函数)开始,逐步跟踪代码的执行路径。当然,有的项目的入口较多,大家可以根据自己实际项目来学习。第五步Debug 和注释:使用调试工具逐步执行代码,观察程序的运行过程。在关键部分添加注释,帮助自己理解代码的逻辑。学会调试代码是学习过程中的重要环节,理解程序的运行逻辑。第六步修改和测试:尝试修改项目的某个部分,增加新功能或修复 bug。确保对现有功能没有负面影响,通过运行项目的测试用例来验证修改。在掌握代码的前提下,可以对源代码中的问题和缺陷进行修改,增加我们的参与度。第七步参与社区讨论:加入项目的邮件列表、论坛或聊天室,参与讨论,向其他贡献者请教,分享你的见解。第八步学习实践:通过实践来学习,为项目提供 bug 修复、功能改进或文档更新等贡献。提交 Pull Request,等待项目维护者的反馈和建议。第九步反复学习:不断阅读、分析和修改不同的开源项目,逐渐提高你的编程能力和对软件架构的理解。

        在进行源码学习的过程中,对源代码的编译是一个重要的环节。对源码的编译在学习过程中至关重要,有的时候我们需要进行二次开发,仅仅是需要修改程序的启动端口和配置文件。有的时候,我们需要对源代码进行修改,修复bug。在bug修复完成之后,我们都需要进行代码的编译及发布。这样才可以发布给其它的项目组或者客户来使用。

        本文以GeoTools开源项目为例,重点来讲解如何在本地离线来编译GeoTools28.X,博文首先介绍GeoTools中版本的知识,介绍GeoTools和GeoServer以及JDK的关系;然后介绍如何在JDK1.8当中来进行GeoTools的源代码来进行编译。通过文本,您可以熟悉GeoTools的版本与Jdk的依赖关系,同时掌握如何使用Maven来进行GeoTools的源码构建。

一、GeoTools与Jdk的版本关系

        在介绍如何编译GeoTools的源代码之前,我们应该先来了解一下GeoTools的版本与Jdk版本的关系。不同的GeoTools的版本应该对应什么版本的JDK,甚至于在不同的GeoServer中对应的GeoTools的版本。了解这些知识都是非常重要的。本节将重点来介绍这三者的版本对应关系。

1、GeoTools与Jdk版本

        在GeoTools的官方网站中,在软件升级的相关章节中对GeoTools与Jdk的版本对应关系进行了详细的介绍。在清单式的内容介绍中,让我们了解了其兼容情况,GeoTools的升级指南。

         截止博文编写前,GeoTools的最新版本是32.X。Oracle在2024年3月19日正式发布了JDK 22,这个版本提供了12个JDK增强建议,旨在优化Java语言并提升开发平台的性能、稳定性和安全性。此外,JDK 22引入了多个新的特性和改进,这些改进包括性能优化、模块化系统增强以及新的API和语言特性,为Java开发者提供了更加丰富的编程体验‌。

        通过GeoTools的官方升级说明可以看到以下的几条跟JDK版本相关的信息。这是在29.X的版本中提到的与Jdk版本的信息。

GeoTools 29.x

Java 11 as the minimum version

GeoTools 29.x requires Java 11 as the minimum version. If you are still using Java 8, you will have to remain on GeoTools 28.x or ealier.

        在21.x的版本中也提到了Jdk的版本信息,版本升级信息描述如下。

GeoTools 21.x

GeoTools 21 is the first is compatible with Java 8 and Java 11.

GeoTools 20.x

GeoTools 20 requires Java 8.

GeoTools is built and tested with Java 8 at this time, to use this library in a Java 9 or Java 10 environment additional JVM runtime arguments are required:

--add-modules=java.xml.bind --add-modules=java.activation -XX:+IgnoreUnrecognizedVMOptions
These settings turn on several JRE modules that have been disabled by default in Java 9 onward.

GeoTools 15.x
GeoTools 15.x requires Java 8:

GeoTools 12.0
GeoTools now requires Java 7 and this is the first release tested with OpenJDK! Please ensure you are using JDK 1.7 or newer for GeoTools 12. Both Oracle Java 7 and OpenJDK 7 are supported, tested, release targets.

GeoTools 9.0
Wiki

https://github.com/geotools/geotools/wiki/9.x

For background details on any API changes review the change proposals above.

GeoTools 9 has resolved a long standing conflict between FeatureCollection acting as a “result” set capable of streaming large data sets vs. acting as a familiar Java Collection. The Java 5 “for each” syntax prevents the safe use of Iterator (as we cannot ensure it will be closed). As a result FeatureCollection no longer can extend java Collection and is acting as a pure “result set” with streaming access provided by FeatureIterator.

        通过上面的升级日志可以看到GeoTools与Jdk的对应关系。在GeoTools的github网站上可以看到对应关系,GeoServer版本对应关系。

GeoServerGeoWebCacheGeoToolsStableMaint.EOL*Java**Tomcat***
2.26.x1.26.x32.x2024-002024-042025-0811,178.5, 9
2.25.x1.25.x31.x2024-032024-092025-04118.5, 9
2.24.x1.24.x30.x2023-092024-042024-08118.5, 9
2.23.x1.23.x29.x2023-032023-092024-04118.5, 9
2.22.x1.22.x28.x2022-092023-042023-098,118.5, 9
2.21.x1.21.x27.x2022-052022-102023-048,118.5, 9
2.20.x1.20.x26.x2021-092022-042022-09*8,118.5, 9
2.19.x1.19.x25.x2021-032021-102022-04*8,118.5, 9
2.18.x1.18.x24.x2020-092021-042022-04*8,118.5, 9
2.17.x1.17.x23.x2020-042020-122021-02*8,118.5, 9

        从GeoTools29.X开始,Jdk的最小版本就需要使用Jdk11。如果您当前还是用Jdk8的话,请根据对应关系,使用GeoTools28.x的版本。如果您使用更老的Jdk7或者更老,请结合升级日志来使用匹配的Jdk。

2、编译环境简介

        在上一小节中,我们对版本的对应关系进行了详细的介绍。这里将对本机的编译环境包括Java和Maven的环境进行介绍。在这里仅对环境进行说明,假定您是一位熟悉Java的开发者,对于如何配置java的环境变量和Maven的安装与配置已经非常熟悉,如果您对此不是很熟悉,可以在互联网上寻找相关的资料,对相关知识进行提前学习。

        Java版本:由于个人很多的项目都是采用1.8的jdk,因此这里我们采用1.8。在Window环境中使用Java 命令来进行查看。

        使用建议,如果大家在后期要升级到更高版本的jdk,我们可以使用OpenJdk的版本进行编译,是完全没有问题的。 

        Maven 版本,在本机我们采用的Maven3.3.9版本的,使用mvn -v 命令来查看。

        以上两部分的信息非常重要,掌握不同的版本及依赖版本的对应关系,对于我们如何选择GeoTools版本来进行编译至关重要。

二、使用Maven编译GeoTools28.X

        在了解和掌握了各版本的相关知识后,我们正式使用Maven来进行源代码的编译。下面来进行详细的介绍,同时讲解在编译过程中可能遇到的问题。

1、GeoTools28.x

        GeoTools的源代码托管在Github上,大家可以从Github上下载自己需要的版本。由于我个人电脑上安装的是JDK1.8,因此我们能选择的最大的GeoTools版本就是28.X。基本上也够用了。首先我们从github的代码中心下载源码。这里我们对下载的源码进行说明。

         下面结合GeoTools的源码对各个目录进行一个简单的说明,方便大家及时的掌握源码结构,在针对性的学习时有一个参考。

序号目录说明
1build用于存放构建过程中的Java项目
2docs用于存放文档和html页面的目录
3licenses授权描述目录
4modules/libaryGeoTools的核心库
5modules/extensions存放基于核心库的扩展库
6modules/ogc存放符合OGC规范的数据结构和实现
7modules/plugins存放相关插件的目录
8modules/unsupported存放社区插件的目录
9tutorials存放教程文件的目录

        通过源代码可以看到,GeoTools是一个多模块的项目。在Maven中,多模块采用插件式组装在一起,在需要的时候,Pom文件会根据我们定义的依赖项进行组件的搭配,实现我们的需求。每个模块都有自己独立的Pom.xml文件。子模块的项目文件继承了父模块的项目文件。最上级的模块,是根模块。Geotools的模块之间有互相依赖的关系,因此第一次运行,需要完整的构建整个项目的包,进行完整的编译。下面我们进行代码的编译。

2、Maven的完整编译

        网络说明,在进行Maven构建时,请确保本地的网络是正常可以连接互联网的。因为初次构建时,Maven需要从网上下载相关的依赖包。由于是初步构建,maven拉取依赖包的时间会比较长,我本机实测,大概需要30分钟左右才编译完成。第二次构建的话,速度会提高,后续的构建在10分钟左右,本机构建实测大概11分钟。

        编译命令如下:

mvn clean install -DskipTests

        在docs命令窗口执行以上的命令后,就可以看到执行的整个过程,后面就是耐心的等待过程:

        如果是首次构建,在等待30分钟左右(视具体的网络环境而定)可以看到编辑成功的界面。 

        在控制台中看到build success的文本即表示构建成功,同时输出了编译时间、一共的耗时、编译的内存消耗。

[INFO] Process Geometry ................................... SUCCESS [  1.252 s]
[INFO] GeoJSON support (Jackson based) .................... SUCCESS [  2.194 s]
[INFO] GeoJSON Datastore .................................. SUCCESS [  1.820 s]
[INFO] GeoJSON Support .................................... SUCCESS [  2.824 s]
[INFO] MBTiles Module ..................................... SUCCESS [  3.105 s]
[INFO] GML geometry XML parsing support using StAX ........ SUCCESS [  1.129 s]
[INFO] WFS client module (NG) ............................. SUCCESS [  7.058 s]
[INFO] OGR DataStore Module ............................... SUCCESS [  0.103 s]
[INFO] Core OGR DataStore Module .......................... SUCCESS [  1.757 s]
[INFO] JNI OGR DataStore Module ........................... SUCCESS [  1.174 s]
[INFO] PostGIS Raster Plugin .............................. SUCCESS [  1.985 s]
[INFO] TPK Module ......................................... SUCCESS [  1.567 s]
[INFO] gt-cql-json ........................................ SUCCESS [  1.278 s]
[INFO] VSI Plugin ......................................... SUCCESS [  1.732 s]
[INFO] OGC CQL2 support ................................... SUCCESS [  2.950 s]
[INFO] Teradata DataStore ................................. SUCCESS [  2.215 s]
[INFO] STAC API Datastore ................................. SUCCESS [  3.734 s]
[INFO] gt-vector-mosaic ................................... SUCCESS [  1.639 s]
[INFO] Geotools Release ................................... SUCCESS [  1.572 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:42 min
[INFO] Finished at: 2024-09-16T07:26:13+08:00
[INFO] Final Memory: 344M/1269M

        编译完成之后,我们就可以在项目中来使用这些依赖了。使用install命令后,在本地的开发仓库中就已经有了我们编译好的包,下面是一个示例:

3、构建时的问题

        在进行Maven程序构建时,可能会遇到编译失败的问题。如果在编译工程中遇到失败的情况,请检查Maven的日志输出,判断错误的原因,并修复报错信息后,重新执行mvn clean install命令重新编译即可。

在实际编译过程中,如果网络太慢,可以选择使用阿里云来进行加速。下面是几点加速编辑的方法:第一、尽量不使用Mvn clean命令。这样需要清除信息后重新构建,速度会更慢。第二、使用Maven多线程构建。第三是单个重建,不要在全部模块选择重建,这样也能加速构建。第四,尽量使用离线构建(请注意:仅当所有GeoTools的依赖包都下载到本地时使用)

三、总结

        以上就是本文的主要内容,本文以GeoTools开源项目为例,重点来讲解如何在本地离线来编译GeoTools28.X,博文首先介绍GeoTools中版本的知识,介绍GeoTools和GeoServer以及JDK的关系;然后介绍如何在JDK1.8当中来进行GeoTools的源代码来进行编译。通过文本,您可以熟悉GeoTools的版本与Jdk的依赖关系,同时掌握如何使用Maven来进行GeoTools的源码构建。行文仓促,定有许多不足之处,如有不当之处,还恳请各位专家博友在评论区留言指正,万分感谢。

博文编写过程中,参考了以下资料,在此列出:

        1、GeoServer版本对应关系。

        2、Geoserver 以及 Geotools各版本和jdk版本对照表。

        3、geotools升级。

        4、Geotools Maven编译说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NeurIPS 2023 | 基于 Llama 的单变量时序预测基础模型

概率时间序列预测是在广泛应用中出现的一个重要实际问题,包括金融、天气预报、脑成像和计算机系统性能管理等领域。针对这一任务,已经提出了各种方法,从传统的自回归模型到最近基于深度学习架构的神经预测方法。这些以前的方法大多集中在用来…

八、动态规划-算法总结

文章目录 八、动态规划8.1 背景8.1.1 DFS8.1.2 DFS的优化8.1.3 从DFS到动态规划 8.2 使用场景8.3 四点要素 常见四种类型8.4 矩阵类型8.4.1 最小路径和8.4.2 不同路径8.4.3 不同路径 II 8.5 序列类型8.5.1 爬楼梯8.5.2 最长递增子序列8.5.3 单词拆分小结 8.6 双序列类型8.6.1 最…

匹配行最大值替换为最小值公式

好的!我们一步一步详细讲解这个公式的作用和如何实现你想要的功能。 ### 数据结构假设: - 你的数据在 A、B、C 列中,每一行都有值。 - 需要在 A 列和 B 列相同的行中,找到 C 列中的最大值,将其替换为最小值,其他值保持不变。 ### 公式: ```excel =IF(C2=MAX(IF(($A$2:$…

借老系统重构我准备写个OpenAPI3.1版的API管理工具(附录屏演示)

前段时间一直在忙公司老系统重构的方案设计,其中最大的重构点就是前后端分离。为了加快前后端协同开发和对接的工作效率,我决定写一个公司内部使用的OpenAPI3.1版的API管理工具。 文章目录 有现成的工具为啥不用现有成熟方案初步成果展示录屏演示下一步计…

调制是什么,为什么

一、什么是调制、解调? 调制:将信息承载到满足信道要求的高频信号上的过程就是调制。 解调:解调是调制的逆过程,将有用的信息从高频信号中恢复出来的过程就是解调。 二、为什么需要调制? 通信是为了实现“信息”的传…

[240916] X-CMD 发布 v0.4.11:新增 mac 模块,集成 MacOS 实用功能 | 新增 OpenAI o1 系列模型的支持

目录 X-CMD 发布 v0.4.11📃Changelog✨ mac - 集成 MacOS 实用功能✨ openai✨ gh✨ jina✅ 升级指南 X-CMD 发布 v0.4.11 📃Changelog ✨ mac - 集成 MacOS 实用功能 新增 mac 模块,用于集成 MacOS 用户需要的各种实用功能,以…

LabVIEW机械手视觉引导系统

开发了LabVIEW软件和硬件工具开发的高精度机械手视觉引导系统。系统通过高效的视觉识别和精确的机械操作,提升工业自动化领域的生产效率和操作精度。 项目背景: 随着工业自动化的不断发展,对生产效率和精确度的要求也日益增高。传统的机械手…

应用层协议HTTP介绍

一、HTTP协议介绍 HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本。 超文本:视频,音…

【多系统萎缩患者必看】科学锻炼秘籍,让生命之树常青

亲爱的小红书朋友们,👋 今天我们要聊一个温暖而坚韧的话题——关于多系统萎缩(MSA)患者的锻炼指南。在这个充满挑战的旅程中,锻炼不仅是身体的锻炼,更是心灵的滋养,是对抗病魔的勇敢姿态&#x…

超级全面的Python功能图谱

Python作为一种高级编程语言,以其简洁清晰的语法、强大的标准库以及活跃的社区支持而受到广泛欢迎。无论是在科学计算、数据分析、Web开发还是机器学习等领域,Python都是首选的语言之一。本文旨在提供一个全面的Python功能图谱,覆盖从基础语法…

遗传算法(GA算法)求解实例---旅行商问题 (TSP)

目录 一、采用GA求解 (TSP)二、 旅行商问题2.1 旅行商问题简介2.2 使用遗传算法解决 TSP2.2.1 遗传算法求解 TSP 的基本步骤 2.3 实际例子:求解 6 个城市的 TSP1. 初始化种群2. 计算适应度3. 选择操作4. 交叉操作5. 变异操作6. 生成新种群7. 迭代与终止 三、 **采用…

用户体验在网站建设中的重要性

用户体验在网站建设中的重要性不言而喻。以下是对其重要性的具体介绍: 提升用户满意度:用户体验的优劣直接关系到用户对网站的满意程度。一个设计良好、易于导航、响应迅速的网站能够让用户在使用过程中感到舒适和愉悦,从而增加用户对网站的…

【JavaEE】初识⽹络原理

目录 一、计算机相互连接的方式 1.1 局域网LAN 1.2 广域网WAN 二、网络通信的基础 1.1 IP地址 1.2 格式 1.3 端口号 三、认识协议 1.1 概念 1.2 五元组: 1.3 协议分层 1.4 OSI七层模型 1.5 TCP/IP五层(或四层)协议 一、计算机相互连…

【计算机网络 - 基础问题】每日 3 题(七)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

合并RAR分卷压缩包

因为文件压缩之后体积仍然过大,大家可能会选择进行分卷压缩,那么rar分卷压缩包之后如何合并成一个压缩包文件呢?今天我们来学习rar分卷压缩包,合并成一个的方法。 最基础的方法就是将分卷压缩包解压出来之后,再将文件…

AttributeError: module ‘numpy‘ has no attribute ‘object‘.

报错: AttributeError: module numpy has no attribute object. np.object was a deprecated alias for the builtin object. To avoid this error in existing code, use object by itself. Doing this will not modify any behavior and is safe. 位置&#xff…

HBase集群环境搭建

HBase集群环境搭建 一、集群规划二、前置条件三、集群搭建3.1 下载并解压3.2 配置环境变量3.3 集群配置1. hbase-env.sh2. hbase-site.xml3. regionservers4. backup-masters 3.4 HDFS客户端配置3.5 安装包分发 四、启动集群4.1 启动ZooKeeper集群4.2 启动Hadoop集群4.3 启动HB…

rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链

前言 rtems 是一款比较优秀的 RTOS,官方网址 https://www.rtems.org/ 当前 rtems 最新发布的版本:rtems-5.3 版本, 下载地址 https://ftp.rtems.org/pub/rtems/releases/5/5.3/ rtems 支持的 平台也是比较多的,当前支持 STM32F4…

差分进化算法(DE算法)求解实例---旅行商问题 (TSP)

目录 一、采用DE求解 TSP二、 旅行商问题2.1 实际例子:求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏(后续和其他算法进行对比) 三、 如何修改代码?3.1 减少城市坐标,如下&am…

关系数据库(6,7,8)

目录 除运算 例子 关系演算 元组关系演算语言ALPHA 检索操作 更新操作 插入操作 删除操作 除运算 其中x,y,z是属性组,r对s的除运算得到新的关系p(x),列数减少了,变得只有一列。 例子 当…