从零开始学GeoServer源码(一)(搭建开发环境Win10+IDEA23.3.5+jdk11+geoserver2.24.x)

搭建开发环境

    • 参考资料
  • 0、基础环境准备
    • 0.1、idea
    • 0.2、jdk
    • 0.3、源码
  • 1、导入工程
  • 2、配置启动环境
    • 2.1、打开新增配置面板
    • 2.2、配置工作目录
      • 2.2.1、从常用配置中选择
      • 2.2.2、直接粘贴
    • 2.3最终效果
  • 3、调整源码
    • 3.1、添加maven引用
    • 3.2、注释无效代码
    • 3.3、删除测试代码
  • 4、修改运行端口
    • 4.1、直接修改启动类中的端口设置
    • 4.2、修改jetty配置
  • 5、启动

参考资料

  1. 主要参考了这个系列,因此文档开头特别感谢一下https://blog.csdn.net/xiangshangdemayi/article/details/122441730
  2. 添加依赖的参考文档https://blog.csdn.net/qq_15065903/article/details/128781051
  3. maven仓库https://mvnrepository.com/artifact/javax.xml.soap/javax.xml.soap-api

0、基础环境准备

0.1、idea

我使用的是2023.3.5
在这里插入图片描述

0.2、jdk

部门的工程主要使用的是jdk1.8,geoserver2.24.x源码使用的是jdk11以上。所以需要安装一下jdk11。我使用的是OpenLogic的OpenJDK,以前用Oracle的openjdk还得登录,所以没有用Oracle的。

在这里插入图片描述
ps:
各个openjdk版本资源列表:https://jdk.java.net/archive/
写这篇文档的时候才发现这个网页。囊括了几乎所有维护中的版本。比较友好。提供的文件是编译好的,下载后不用配置,放到固定位置即可(个人推荐c:/java/openjdk11)

0.3、源码

公司当前使用的是geoserver-cloud 2.24.2.因此选用了2.24.x这个分支
在这里插入图片描述

1、导入工程

在这里插入图片描述
代码下载好之后按提示打开工程,然后切换到2.24.x分支
在这里插入图片描述
idea自动检测maven工程。安装提示窗,load即可
在这里插入图片描述
识别完成后,确认每个模块的jdk版本。右键任意一个模块名称,如:src[geoserver] 。选择右键后弹出菜单中的 Open Module Settings。
在这里插入图片描述
确保每个module的jdk都是11以上
在这里插入图片描述

2、配置启动环境

2.1、打开新增配置面板

在这里插入图片描述
添加配置
在这里插入图片描述
在这里插入图片描述

2.2、配置工作目录

2.2.1、从常用配置中选择

在这里插入图片描述

在这里插入图片描述
把默认目录删除,保证working directory框里只有$MODEL_DIR $ 复制的时候记得把第二个$ 符号之前的空格删除(暂时不知道怎么在MarkDown中打出两个$$夹内容)
在这里插入图片描述

2.2.2、直接粘贴

直接向working directory框里输入$MODEL_DIR $
复制的时候记得把第二个$ 符号之前的空格删除(暂时不知道怎么在MarkDown中打出两个$$夹内容)

2.3最终效果

总共需要保证五处都改好了。
在这里插入图片描述
注:
如果Working directory没设置好,可能会报4.4错误
在这里插入图片描述
参考文档中的errorprone问题没有遇到,我直接安装了这个插件。就不补充了

3、调整源码

3.1、添加maven引用

源码中有个类缺少Node引用。编译的时候报错,点击报错的提示,定位到源码文件的工程。在pom.xml中添加maven依赖
在这里插入图片描述

文件目录:src/wcs1_1/pom.xml

<!-- https://mvnrepository.com/artifact/javax.xml.soap/javax.xml.soap-api -->
<dependency><groupId>javax.xml.soap</groupId><artifactId>javax.xml.soap-api</artifactId><version>1.4.0</version>
</dependency>

在这里插入图片描述
代码添加引用
源文件相对目录:src/wcs1_1/src/main/java/org/geoserver/wcs/kvp/rangesubset/AbstractContentNode.java

package org.geoserver.wcs.kvp.rangesubset;
import javax.xml.soap.Node;
public abstract class AbstractContentNode implements Node {protected String content;public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}

3.2、注释无效代码

需要修改的源文件(相对目录)src/wcs1_1/src/main/java/org/geoserver/wcs/kvp/RangeSubsetKvpParser.java
文件注释后的结果

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved* (c) 2001 - 2013 OpenPlans* This code is licensed under the GPL 2.0 license, available at the root* application directory.*/
package org.geoserver.wcs.kvp;import static org.vfny.geoserver.wcs.WcsException.WcsExceptionCode.InvalidParameterValue;import java.io.StringReader;
import net.opengis.ows11.CodeType;
import net.opengis.ows11.Ows11Factory;
import net.opengis.wcs11.AxisSubsetType;
import net.opengis.wcs11.FieldSubsetType;
import net.opengis.wcs11.RangeSubsetType;
import net.opengis.wcs11.Wcs111Factory;
import org.geoserver.ows.KvpParser;
//import org.geoserver.wcs.kvp.rangesubset.ASTAxisId;
//import org.geoserver.wcs.kvp.rangesubset.ASTAxisSubset;
//import org.geoserver.wcs.kvp.rangesubset.ASTFieldId;
//import org.geoserver.wcs.kvp.rangesubset.ASTFieldSubset;
//import org.geoserver.wcs.kvp.rangesubset.ASTInterpolation;
//import org.geoserver.wcs.kvp.rangesubset.ASTKey;
//import org.geoserver.wcs.kvp.rangesubset.ASTRangeSubset;
//import org.geoserver.wcs.kvp.rangesubset.Node;
//import org.geoserver.wcs.kvp.rangesubset.RangeSubsetParser;
//import org.geoserver.wcs.kvp.rangesubset.RangeSubsetParserVisitor;
//import org.geoserver.wcs.kvp.rangesubset.SimpleNode;
import org.vfny.geoserver.wcs.WcsException;/*** Parses the RangeSubset parameter of a GetFeature KVP request** @author Andrea Aime*/
public class RangeSubsetKvpParser extends KvpParser {public RangeSubsetKvpParser() {super("RangeSubset", RangeSubsetType.class);}@Overridepublic Object parse(String value) throws Exception {return null;/*  RangeSubsetParser parser = new RangeSubsetParser(new StringReader(value));SimpleNode root = parser.RangeSubset();RangeSubsetType result =(RangeSubsetType) root.jjtAccept(new RangeSubsetKvpParserVisitor(), null);for (Object o : result.getFieldSubset()) {FieldSubsetType type = (FieldSubsetType) o;String interpolationType = type.getInterpolationType();if (interpolationType != null) {try {InterpolationMethod.valueOf(interpolationType);} catch (IllegalArgumentException e) {throw new WcsException("Unknown interpolation method " + interpolationType,InvalidParameterValue,"RangeSubset");}}}return result;*/}/*    private static class RangeSubsetKvpParserVisitor implements RangeSubsetParserVisitor {Wcs111Factory wcsf = Wcs111Factory.eINSTANCE;Ows11Factory owsf = Ows11Factory.eINSTANCE;@Overridepublic Object visit(SimpleNode node, Object data) {throw new UnsupportedOperationException("This method should never be reached");}@Override@SuppressWarnings("unchecked") // EMF model without genericspublic Object visit(ASTRangeSubset node, Object data) {RangeSubsetType rs = wcsf.createRangeSubsetType();for (int i = 0; i < node.jjtGetNumChildren(); i++) {ASTFieldSubset fs = (ASTFieldSubset) node.jjtGetChild(i);FieldSubsetType fst = (FieldSubsetType) fs.jjtAccept(this, data);rs.getFieldSubset().add(fst);}return rs;}@Override@SuppressWarnings("unchecked") // EMF model without genericspublic Object visit(ASTFieldSubset node, Object data) {FieldSubsetType fs = wcsf.createFieldSubsetType();for (int i = 0; i < node.jjtGetNumChildren(); i++) {Node child = node.jjtGetChild(i);if (child instanceof ASTFieldId) {CodeType id = owsf.createCodeType();id.setValue((String) child.jjtAccept(this, null));fs.setIdentifier(id);} else if (child instanceof ASTInterpolation) {fs.setInterpolationType((String) child.jjtAccept(this, null));} else if (child instanceof ASTAxisSubset) {fs.getAxisSubset().add(child.jjtAccept(this, null));}}return fs;}@Override@SuppressWarnings("unchecked") // EMF model without genericspublic Object visit(ASTAxisSubset node, Object data) {AxisSubsetType as = wcsf.createAxisSubsetType();as.setIdentifier(((SimpleNode) node.jjtGetChild(0)).getContent());for (int i = 1; i < node.jjtGetNumChildren(); i++) {as.getKey().add(node.jjtGetChild(i).jjtAccept(this, null));}return as;}@Overridepublic Object visit(ASTFieldId node, Object data) {return node.getContent();}@Overridepublic Object visit(ASTAxisId node, Object data) {return node.getContent();}@Overridepublic Object visit(ASTInterpolation node, Object data) {return node.getContent();}@Overridepublic Object visit(ASTKey node, Object data) {return node.getContent();}}*/
}

3.3、删除测试代码

做好以上处理后,我启动时测试代码报错,提示找不到文件。为了快速启动,直接把测试代码删掉了。猜测是我没有配置测试环境
在这里插入图片描述

4、修改运行端口

4.1、直接修改启动类中的端口设置

找了半天才找到启动类的位置,是个测试类,相对路径:src/web/app/src/test/java/org/geoserver/web/Start.java
在这里插入图片描述
直接修改启动类的端口就可以了,我改成了8010

在这里插入图片描述
能正常启动
在这里插入图片描述

4.2、修改jetty配置

我下载的这个pom文件里引用jetty组件异常,所以pom里面设置的端口号没起效果。我只用了上边那种方式,直接在启动类修改了端口
在这里插入图片描述
在这里插入图片描述

5、启动

在这里插入图片描述

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

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

相关文章

LeetCode esay mid 记录

1486. 数组异或操作 感觉一般也用不到 emmm 灵茶山艾府传送门 推导过程可以结合官网部分观看 重点由两部分的结合 将特定部分转换为常见部分 0到n的异或和表示 2595. 奇偶位数 0x555是十六进制数&#xff0c;转换为二进制为 0101 0101 0101 class Solution {public int[…

【面试 - 页面优化举例】页面跳转卡顿问题解决 - 页面跳转速度优化

目录 为何要优化如何优化优化1 - 懒加载优化2 - el-tree 子节点默认不展开 为何要优化 页面A跳转到也页面B时&#xff0c;页面出现卡顿情况&#xff1a; 【问题】页面A → 页面B时&#xff0c;页面B进入到了 created 钩子后过了六七秒才进入到 mounted 钩子&#xff1b;【分析经…

吉林省教育学院学报杂志社吉林省教育学院学报编辑部2024年第5期目录

“研培一体”理论与实践 教师培训管理共同体的职能定位与价值追求 张岩; 1-3 数字化转型背景下教师培训工作的发展路径 李春光; 4-6 挖掘数智潜能&#xff0c;推进教师培训融合创新 鲍赫; 7-9《吉林省教育学院学报》投稿&#xff1a;cn7kantougao163.com 精准培…

Apache DolphinScheduler查看版本信息

我找了半天&#xff0c;没有看到版本在哪里。然后我看配置&#xff0c;他要连接数据库&#xff0c;我去他存储数据库的表里面&#xff0c;看到了相关的版本信息。 cd /home/dolphinscheduler/dolphinscheduler/bin/env dolphinscheduler找到了里面的密码 版本是3.1.3

14.编写自动化测试(上)

标题 一、如何编写测试1.1 一些概念1.2 测试函数剖析1.3 使用assert!宏检查结果1.4 使用assert_eq!和assert_ne!宏来测试相等1&#xff09; assert_eq!2&#xff09; assert_ne! 1.5 使用 should_panic 检查 panic 二、将 Result<T, E> 用于测试 一、如何编写测试 1.1 一…

Windows defender bypass | 免杀

官方文档 在制作免杀的过程中,翻找 Windows 官方对 Windows Defender 的介绍,发现有这样一个目录:Configure Microsoft Defender Antivirus exclusions on Windows Server(在 Windows server 中配置defender排除项)。 https://docs.microsoft.com/en-us/microsoft-365/se…

N32G45XVL-STB之移植LVGL(8.4.0)

目录 概述 1 系统软硬件 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 认识LVGL 2.1 LVGL官网 2.2 下载V8.4.0 3 移植LVGL 3.1 硬件驱动实现 3.2 添加LVGL库文件 3.3 移植和硬件相关的代码 3.3.1 驱动接口相关文件介绍 3.3.2 重新接口函数 3…

视频合成渲染服务解决方案,数字人+PPT+视频云剪辑

在金融理财领域&#xff0c;一个生动、直观、专业的视频&#xff0c;往往能够在海量信息中脱颖而出&#xff0c;帮助客户更好地理解产品、把握市场动态。然而&#xff0c;传统的视频制作方式往往周期长、成本高、难以适应快速变化的市场需求。 美摄科技&#xff0c;作为行业领…

XZ后门故事:初始分析

2024年3月29日&#xff0c;Openwall OSS安全邮件列表上的一条消息“炸醒”了整个信息安全、开源和Linux社区&#xff1a;XZ出现了一个CVSS评分10.0的恶意后门。 这个后门库的特殊危险在于OpenSSH服务器进程sshd使用它。在多个基于systemd的发行版上&#xff08;包括Ubuntu、De…

从根源解决问题:构建体系化BOM管理机制与解决方案

BOM&#xff08;物料清单&#xff09;是设计与生产间的纽带&#xff0c;其准确及时对企业的竞争力至关重要。然而&#xff0c;维护BOM数据时&#xff0c;常遇到录入错误、信息孤岛及跨部门沟通障碍等难题&#xff0c;直接影响生产效率和成本。为此&#xff0c;道合顺将探讨确保…

Hi3861 OpenHarmony嵌入式应用入门--点灯

本篇实现对gpio的控制&#xff0c;通过控制输出进行gpio的点灯操作。 硬件 我们来操作IO2&#xff0c;控制绿色的灯。 软件 GPIO API API名称 说明 hi_u32 hi_gpio_deinit(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO…

如何使用xurlfind3r查找目标域名的已知URL地址

关于xurlfind3r xurlfind3r是一款功能强大的URL地址查询工具&#xff0c;该工具本质上是一个CLI命令行工具&#xff0c;可以帮助广大研究人员从多种在线源来查询目标域名的已知URL地址。 功能介绍 1、从被动在线源获取URL地址以实现最大数量结果获取&#xff1b; 2、支持从Way…

遗传算法浅理解

1. 什么是遗传算法&#xff1f; ​ 遗传算法&#xff0c;又称为 Genetic algorithm(GA)Genetic algorithm(GA)。其主要思想就是模拟生物的遗传与变异。它的用途非常广泛&#xff0c;可以用于加速某些求最大或者最小值的算法&#xff08;换句话说就是加速算法收敛&#xff0c;最…

移动端专业视频剪辑解决方案,深度编辑,专业级体验

面对众多繁杂的移动端视频编辑软件&#xff0c;如何挑选一款既高效又专业的解决方案&#xff0c;成为众多企业关注的焦点。美摄科技凭借其卓越的技术实力&#xff0c;推出了面向企业的移动端专业视频剪辑解决方案&#xff0c;助力企业轻松打造高质量视频内容。 一、深度编辑&a…

OAuth 2.0:现代应用程序的授权标准

前言 随着互联网和移动应用的发展&#xff0c;应用程序之间的交互变得越来越普遍。用户希望通过单一的身份认证在多个平台上无缝体验&#xff0c;这就要求不同的应用程序能够安全地共享用户数据。而 OAuth 2.0 正是为了解决这一问题而设计的&#xff0c;它提供了一种标准机制&…

Golang 百题(实战快速掌握语法)_1

整形转字符串类型 实验介绍 本实验将展示三种方法来实现整形类型转字符串类型。 知识点 strconvfmt Itoa 函数 代码实例 Go 语言中 strconv 包的 itoa 函数输入一个 int 类型&#xff0c;返回转换后的字符串。下面是一个例子。 package mainimport ("fmt"&qu…

wps 二维数据转转一维度数据

HSTACK(TOCOL(C2:H2&A3:A8),TOCOL(B3:B8&C1:H1),TOCOL(C3:H8))

网络编程(三)UDP TFTP协议

文章目录 一、 UDP&#xff08;一&#xff09;概述&#xff08;二&#xff09;流程 二、收发函数&#xff08;一&#xff09;recvfrom&#xff08;二&#xff09;sendto 三、实现一个简单的udp服务端和客户端四、实现tftp客户端协议 一、 UDP &#xff08;一&#xff09;概述 …

Spring-事件

Java 事件/监听器编程模型 设计模式-观察者模式的拓展 可观察者对象(消息发送者) Java.util.Observalbe观察者 java.util.Observer 标准化接口(标记接口) 事件对象 java.util.EventObject事件监听器 java.util.EventListener public class ObserverDemo {public static vo…

Spring IoC【控制反转】DI【依赖注入】

文章目录 控制反转&#xff08;IoC&#xff09;依赖注入&#xff08;DI&#xff09;IoC原理及解耦IoC 容器的两种实现BeanFactoryApplicationContext IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&…