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

搭建开发环境

参考资料

  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

yaml 复制代码
<!-- 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

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

文件注释后的结果

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);
    }

    @Override
    public 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;

        @Override
        public Object visit(SimpleNode node, Object data) {
            throw new UnsupportedOperationException("This method should never be reached");
        }

        @Override
        @SuppressWarnings("unchecked") // EMF model without generics
        public 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 generics
        public 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 generics
        public 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;
        }

        @Override
        public Object visit(ASTFieldId node, Object data) {
            return node.getContent();
        }

        @Override
        public Object visit(ASTAxisId node, Object data) {
            return node.getContent();
        }

        @Override
        public Object visit(ASTInterpolation node, Object data) {
            return node.getContent();
        }

        @Override
        public 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、启动

相关推荐
GIS瞧葩菜6 天前
GeoSever发布图层(保姆姬)
wms·geoserver·cesium
Q行天下2 个月前
leaflet加载GeoServer的WMS地图服务.md
wms·geoserver·leaflet
ReBeX2 个月前
【WebGIS实例】(16)GeoServer 自定义样式 - 渲染矢量数据
geoserver·webgis
猿儿本无心2 个月前
Geoserver的 rest、wfs、wms、wps接口请求指南
前端·geoserver
几多心跳3 个月前
docker 安装 geoserver
docker·容器·geoserver
今天是 几 号4 个月前
【漏洞复现】Geoserver远程代码执行漏洞(CVE-2024-36401)
安全·geoserver·cve·rce
骐骥15 个月前
开源WebGIS全流程常用技术栈
geoserver·postgis·webgis
我码玄黄6 个月前
GeoServer安装以及部署
java·docker·geoserver
是席木木啊7 个月前
GeoServer:忘记密码重置
linux·geoserver·gis