geonetwork源码编译与开发入门说明
本文介绍geonetwork源码编译及简单的开发修改。
本文包括源码调试的细节,主要给没怎么接触过java又想调试修改部分java代码的提供一定帮助,比如控制器或修改业务逻辑中的增删改操作等
本文使用环境:
操作系统:Windows 11
JDK版本:jdk-8u381-windows-x64.exe
Maven版本:apache-maven-3.9.4
Tomcat版本:apache-tomcat-9.0.80
Elasticsearch版本:elasticsearch-7.9.2-windows-x86_64.zip
GeoNetwork版本:core-geonetwork-4.2.6
IDE:IntelliJ IDEA 2023.2.2
快速启动步骤: 1、启动elasticsearch:bin目录下双击运行elasticsearch.bat 2、使用IDEA打开core-geonetwork,并在终端执行
mvn clean install -DskipTests
3、运行web系统
mvn jetty:run -Penv-dev
1、开发环境要求
github源码路径:https://github.com/geonetwork/core-geonetwork/tree/4.2.6
-
GeoNetwork 4.2.6是使用 Java 8 (LTS) 开发,不支持java11,也无法在 Java 7 (1.6) 或更早版本中运行
-
Web服务器:GeoNetwork 附带一个嵌入式容器Eclipse Jetty,可以更改为tomcat或其它Web容器
-
数据库默认采用H2,可以通过配置更改为Oracle、MySQL、Postgresql等主流数据库
-
GeoNetwork 使用Maven来管理构建过程和依赖项(Maven 3.1.0+)
-
GeoNetwork 搜索引擎构建在 Elasticsearch 之上,需要先完成ES的安装
2、安装搜索引擎Elasticsearch
- 从https://www.elastic.co/downloads/elasticsearch 下载 Elasticsearch 并解压缩文件(建议下载该版本官网配的es版本7.9.2,经实测8版本创建索引会报错)
- 安装完成后运行es,浏览器输入http://localhost:9200/ 验证是否安装成功
- 在geonetwork安装目录下找到路径.\web\geonetwork\WEB-INF\data\config\index,有三个json文件:features.json,records.json,searchlogs.json
在命令行cd到指定目录,执行命令,根据三个json文件创建对应的索引:
cd $GN_DATA_DIRECTORY/config/index
curl -X DELETE http://localhost:9200/features //删除features索引
curl -X DELETE http://localhost:9200/records //删除records索引
curl -X DELETE http://localhost:9200/searchlogs //删除searchlogs索引
curl -X PUT http://localhost:9200/features -H "Content-Type: application/json" -d @features.json //创建features索引
curl -X PUT http://localhost:9200/records -H "Content-Type: application/json" -d @records.json //创建records索引
curl -X PUT http://localhost:9200/searchlogs -H "Content-Type: application/json" -d @searchlogs.json //创建searchlogs索引
注意:
(1)如果之前没有创建过索引,直接使用curl -X PUT创建,如果之前有创建过,需要先删除索引curl -X DELETE,然后再进行创建
(2)如果在Windows中curl命令不可用,需要先下载,下载地址:https://curl.se/windows/
(3)也可以不使用curl命令,直接使用Postman等可以执行HTTP的Put请求的工具:
a)选择HTTP方法为"PUT"。
b)在请求头中,添加一个名为"Content-Type"的头,并将值设置为"application/json"。
c)在请求体中,选择"raw"并将请求的JSON数据放在请求体中。你可以在Postman中直接输入JSON数据,或者从文件中导入它。
3、IDE环境配置
(1)打开File->Setting找到Build Tools下的Maven,修改maven的路径:
(2)确认项目设置是否为java8:
4、构建项目并运行web系统
在Idea中打开core-geonetwork文件夹,在Terminal中执行以下命令(直接通过Windows的cmd命令行,在项目的文件夹中也可以执行构建和运行web应用):
(1)整个项目构建与安装
cd core-geonetwork //定位到指定目录
mvn clean install -DskipTests //执行清理和构建整个项目,并跳过测试
其他编译选项:
mvn clean install //不跳过测试
mvn clean install -o //离线模式下执行构建(需要确保项目的依赖项在本地存储库中可用)mvn clean install -o -DskipTests -T 2C
//在离线模式下清理项目、构建项目、跳过单元测试,并使用2个线程进行构建
构建成功后终端显示如下:
构建完成后,本地Maven存储库包含了由GeoNetwork创建的构件(位于 $HOME/.m2/repository/org/geonetwork-opensource
目录中)
本机位于:D:\Program Files\maven\apache-maven-repository\org\geonetwork-opensource
注意:项目路径下的文件夹名称不能包含中文字符,否则会报错
(2) ES的构建与运行(如果独立安装了es,项目构建前先运行es,可跳过该步)
cd es //定位到es目录
mvn install -Pes-download //激活es-download
mvn exec:exec -Des-start //启动ES
(3)运行Web应用
cd web
mvn jetty:run -Penv-dev //在开发环境(-Penv-dev)中启动Jetty Web服务器
*****************************************************************************
注意:
* 运行带上-Penv-dev参数,确保 GeoNetwork 在没有 JavaScript 缓存的情况下运行,从而允许测试对 Web 用户界面(web-ui)的更改。
运行完命令后,在浏览器输入http://localhost:8080/geonetwork ,即可访问系统。
* 首次运行会自动创建数据库,默认是H2数据(~/gn.mv.db和~/gn.trace.db)
本机数据库路径是:C:\Users\xxx\Documents\gn.mv.db
* Idea配置数据库:View->Tool Windows->Database(添加完数据库后idea右侧侧边栏会增加一个Database标签)
Idea中配置H2数据库连接:jdbc:h2:~/gn
Idea配置PostgreSQL:jdbc:postgresql://localhost:5432/geonetwork(如果缺少驱动,需先下载驱动):
* 在项目的pom.xml文件中,可以根据实际运行情况修改以下配置:
如果要修改jetty的运行端口:
如果要修改ES的主机和端口:
如上图,修改es.host和es.port,可以更改为使用服务器部署好的es,这样本地就不用每次运行es了。
* 如果要修改数据库,如更改为PostgreSQL(默认使用h2数据库)
* 用IntelliJ IDEA设置运行项目的一些设置和步骤说明:
- Setting up:设置
- 先确认IDE环境配置是否正常,如maven配置,java确认是否使用的是java 8,参照上一节 :<3、IDE环境配置>
- 在Maven工具窗口中勾选显示设置,为了更方便的查看和操作
- 勾选"Group Modules",将模块分组
- 勾选"Always Show ArtifactId",始终显示ArtifactId
-
- 使用Maven工具窗口进行以下配置,这些配置主要为了在构建项目(Build Project)的时候先设置好:
- 启用env-dev配置文件——配置文件用于开发环境
- "Skip Tests",切换“跳过测试”模式——默认会执行项目中定义的所有单元测试,为了加快构建速度或者在某些特定情况下忽略测试,需要切换“跳过测试”模式
- "Execute Maven Goal",执行Maven目标:clean install——在构建过程中先清理项目
- 使用Maven工具窗口进行以下配置,这些配置主要为了在构建项目(Build Project)的时候先设置好:
- Building:构建
- Build > Build Project,构建项目,在执行 Maven 构建之后,通过 "Build Project" 命令可以进行项目的增量构建,只编译修改过的文件,从而加快构建速度。
- Running:运行(通过配置jetty:run来运行web系统,如果需要配置tomcat来运行web系统,请参照下一节<5、配置Tomcat来运行web系统>)
- Run > Edit Configurations,打开菜单运行>编辑配置来添加修改配置
- 添加一个新的Maven配置
- 工作目录选择web目录,Working Directory:
core-geonetwork/web
- 在Run中输入jetty:run(或Command Line:
jetty:run)
- 在Profiles输入env-dev
- 工作目录选择web目录,Working Directory:
-
- 在启动之前添加Maven goal:proccess-resources
- 先在Modify options添加运行选项:Add before launch task,添加启动前任务
- 在启动之前添加Maven goal:proccess-resources
-
-
- 添加新任务,选择run Maven Goad
-
-
-
-
命令行输入选择:proccess-resources
-
-
-
-
运行:配置好后点击右上角三角尖或者昆虫图标进行运行或调试
- 测试
- 浏览器中输入地址(如果没有修改端口,默认为8080):http://localhost:8080/geonetwork
- 用户名密码:admin/admin
- 调试
- 使用上面创建的运行配置进行调试。调试模式允许设置断点、检查变量,并逐行地查看代码,以识别和修复问题
env-dev
允许在运行时进行更新,可以在不停止和重新启动应用程序的情况下对代码进行更改- 使用 "Build Project" 进行编译,允许在应用程序正在运行时进行交互式重写,可以在代码运行时进行更改和调整,而不必停止应用程
- 使用 Maven 工具窗口运行 mvn process-resources 来将更改复制到正在运行的 Web 应用程序中
-
(4)重置所有缓存和数据库(谨慎执行,数据库清除的是默认的h2数据库)
cd web mvn clean:clean@reset
(5)重置数据库和es索引(将系统重置到初始化状态)
操作(4)默认可以重置数据库,以及所有缓存,但是只会删除h2数据库,如果用了其他数据库,如Postgresql,则需要还手动去清除。
如果想要重置成初始化的空库,在执行完 mvn clean:clean@reset 后,有两种方式:
a.将原来数据库删除(比如geonetwork),在建一个同名的数据库空库,重新运行web系统,系统会自动初始化数据库
b.或者直接在配置文件里,将数据库配置里的数据库名直接修改成另外一个名称,然后再数据库里建一个同名的空数据库即可
数据库重置后,es索引的数据并没有改变,还是原来的数据,就会导致数据库和es索引的数据不一致,而系统的查询都是从es中查询的,所以为了达到重置效果,需要更新索引数据:
可以通过先删除索引再更新索引:
cd $GN_DATA_DIRECTORY/config/index curl -X DELETE http://localhost:9200/features //删除features索引 curl -X DELETE http://localhost:9200/records //删除records索引 curl -X DELETE http://localhost:9200/searchlogs //删除searchlogs索引 curl -X PUT http://localhost:9200/features -H "Content-Type: application/json" -d @features.json //创建features索引 curl -X PUT http://localhost:9200/records -H "Content-Type: application/json" -d @records.json //创建records索引 curl -X PUT http://localhost:9200/searchlogs -H "Content-Type: application/json" -d @searchlogs.json //创建searchlogs索引
但是通过以上操作发现数据还是旧的,并没有完成更新。
通过localhost:9200/_cat/indices?v查看索引发现geonetwork在索引数据的时候,其实还建了:gn-features,gn-records,gn-searchlogs这些索引,而系统的查询实际大部分用的是gn-records,所以还要删除以下几个索引。
cd $GN_DATA_DIRECTORY/config/index curl -X DELETE http://localhost:9200/gn-features curl -X DELETE http://localhost:9200/gn-records curl -X DELETE http://localhost:9200/gn-searchlogs
删除索引后重新运行系统,系统数据就会完全恢复初始化。
但此时,系统因没有es索引数据,查询会报错,可以通过登录系统,通过加载模板和样例数据后再进行正常访问。
注:导入标准和样例数据,系统会重建索引:gn-features,gn-records,gn-searchlogs
5、配置Tomcat来运行web系统
在配置tomcat前,先确认项目配置下的Moudules和Artifacts下都有相应的配置。
(1)在run->Edit Configurations下,添加tomcat服务
(2)配置好tomcat信息:
(3)切换到Deploment配置输出构件(若只要运行web系统,可以在Before Launch删除Build,免得重复进行项目构建)
(4)配置好后,通过右上角可以运行tomcat,运行系统(只是要运行系统使用三角图标,如果使用小虫子图标那个可以调试代码):
出现的问题:
Before Launch使用Build命令会报错,导致无法使用tomcat运行系统(build报错无法通过,但是用maven clean install命令可以正常编译)。
解决方案:
虽然javac编译异常,但是maven编译是可以的。那么可以通过配置idea,使用maven编译构建来代替 javac的构建(可能存在其他问题,例如关闭时,不能使用控制台的service关闭,需要手动kill 程序,临时可用),
勾选 maven > Runner > Delegate IDE build/run actions to Maven
6、调试java代码
(1)使用调试模式运行tomcat服务
(2)以用户组为例,根据F12找到服务地址
(3)找到源码:core-geonetwork/services/src/main/java/org/fao/geonet/api/groups/GroupsApi.java
在获取组中打个断点:
对应实体类:core-geonetwork/domain/src/main/java/org/fao/geonet/domain/Group.java
对应Repository接口:core-geonetwork/domain/src/main/java/org/fao/geonet/repository/GroupRepository.java
(4)运行系统,点击管理组即可进入断点进行调试。
<本文完>