目录
前言
一、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版本对应关系。
GeoServer | GeoWebCache | GeoTools | Stable | Maint. | EOL* | Java** | Tomcat*** |
---|---|---|---|---|---|---|---|
2.26.x | 1.26.x | 32.x | 2024-00 | 2024-04 | 2025-08 | 11,17 | 8.5, 9 |
2.25.x | 1.25.x | 31.x | 2024-03 | 2024-09 | 2025-04 | 11 | 8.5, 9 |
2.24.x | 1.24.x | 30.x | 2023-09 | 2024-04 | 2024-08 | 11 | 8.5, 9 |
2.23.x | 1.23.x | 29.x | 2023-03 | 2023-09 | 2024-04 | 11 | 8.5, 9 |
2.22.x | 1.22.x | 28.x | 2022-09 | 2023-04 | 2023-09 | 8,11 | 8.5, 9 |
2.21.x | 1.21.x | 27.x | 2022-05 | 2022-10 | 2023-04 | 8,11 | 8.5, 9 |
2.20.x | 1.20.x | 26.x | 2021-09 | 2022-04 | 2022-09* | 8,11 | 8.5, 9 |
2.19.x | 1.19.x | 25.x | 2021-03 | 2021-10 | 2022-04* | 8,11 | 8.5, 9 |
2.18.x | 1.18.x | 24.x | 2020-09 | 2021-04 | 2022-04* | 8,11 | 8.5, 9 |
2.17.x | 1.17.x | 23.x | 2020-04 | 2020-12 | 2021-02* | 8,11 | 8.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的源码对各个目录进行一个简单的说明,方便大家及时的掌握源码结构,在针对性的学习时有一个参考。
序号 | 目录 | 说明 |
1 | build | 用于存放构建过程中的Java项目 |
2 | docs | 用于存放文档和html页面的目录 |
3 | licenses | 授权描述目录 |
4 | modules/libary | GeoTools的核心库 |
5 | modules/extensions | 存放基于核心库的扩展库 |
6 | modules/ogc | 存放符合OGC规范的数据结构和实现 |
7 | modules/plugins | 存放相关插件的目录 |
8 | modules/unsupported | 存放社区插件的目录 |
9 | tutorials | 存放教程文件的目录 |
通过源代码可以看到,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编译说明。