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——在构建过程中先清理项目

        

  • 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

        

    • 在启动之前添加Maven goal:proccess-resources
      • 先在Modify options添加运行选项:Add before launch task,添加启动前任务

        

      • 添加新任务,选择run Maven Goad

        

      • 命令行输入选择:proccess-resources

        

    • 运行:配置好后点击右上角三角尖或者昆虫图标进行运行或调试

    • 测试
    • 调试
      • 使用上面创建的运行配置进行调试。调试模式允许设置断点、检查变量,并逐行地查看代码,以识别和修复问题
      • 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)运行系统,点击管理组即可进入断点进行调试。

<本文完>

posted @ 2023-11-08 16:16  孤草之魂  阅读(57)  评论(0编辑  收藏  举报