Bootstrap

从零开始学GeoServer源码二(搭建开发环境)

快速导航

从零开始学GeoServer源码一(开篇)
从零开始学GeoServer源码二(搭建开发环境)
从零开始学GeoServer源码三(断点应该打在哪?)
从零开始学GeoServer源码四(自定义插件或拓展数据源)
从零开始学GeoServer源码五(切片原理及自定义插件支持wms、wmts、tms)
从零开始学GeoServer源码六(如何打包发布?)
从零开始学GeoServer源码七(如何注册服务并发布3dtiles和cesium的地形terrain?)
从零开始学GeoServer源码八(内存溢出?Out of Memory Error ?)
从零开始学GeoServer源码九(如何集成Cesium以实现预览3dtiles和terrain服务?)
从零开始学GeoServer源码十(如何修改菜单项以整合我们的功能?)
从零开始学GeoServer源码十一(如何解决No Multipart-config for Servlet错误)
从零开始学GeoServer源码十二(GeoServer中的切片规则)
从零开始学GeoServer源码十三(GeoServer生成的矢量切片缺失问题)
从零开始学GeoServer源码十四(GeoServer Cloud微服务版本初体验)

点我去AIGIS公众号查看本文

前言: 上一篇中我们说到了改GeoServer源码的原因,这一篇我们就直接进入正题。开始撸代码之前,当然是搭建开发环境,其实讲搭建开发环境的博文也不是没有,但是因为我是从零开始纯粹靠自己摸索,所以本篇想讲一讲我遇到一些问题,希望能供后来者参考。

1.上 GitHub down 代码

  GeoServerGitHub上的地址为:GeoServer源码,我选择的是比较新的版本,2.19.x,然后下载zip压缩包在本地解压,见下图:
在这里插入图片描述

吐槽一下公司网贼慢,我用流量下的,我的心在滴血~~~~~~

2.使用IDEA导入项目

  idea一般会自动检测到这是一个maven项目,然后右下角会有弹框,选择自动导入,这个过程比较漫长,最好设置一下maven从阿里的仓库去下jar包,那样就会快很多。导入之后是这样的:
在这里插入图片描述

细心的读者可能会发现我这里面多了三个文件夹,myMBTile、myMongoDB、out,前两个是我参考mbtiles插件自己写的插件,至于out,是打jar包之后idea自动创建的。

3.配置启动环境

  点击EditConfigurations,打开配置框,然后点击左侧加号,选择新建Application
在这里插入图片描述
之后修改各配置项如下:
在这里插入图片描述

Name:随便起,GeoServer官网给的Start,我就给了Start
Main class:org.geoserver.web.Start
VM Options:-DGEOSERVER_DATA_DIR=some/path/of/directory
Working directory:$MODULE_DIR$
Use classpath of module:gs-web-app
Shorten command line:JAR mainfest,也可以选其他的,但有时候会报错

4.开始编译

  编译的时候你可能会遇到 noSuchMethodError 错误或者 ErrorProne 错误,对于这两个错误,GeoServer官网给出了两个解决方法。

  1. 安装error-prone插件,并将默认编译器javac改为errorprone
    在这里插入图片描述
  2. mavenProfiles中取消勾选errorproneerrorprone8
    在这里插入图片描述

经过我的实验,方法2 比方法1 效果好,因为方法1即使设置了error-prone为默认编译器,有时候会自动又改回javac,具体原因我没找到,哪位有识之士知道的话可以告诉我一声。

5.添加引用与注释代码

  1. 添加 org.geoserver.wcs.kvp.rangesubsetAbstractContentNode 的NODE引用
    在这里插入图片描述
  2. 注释掉 org.geoserver.wcs.kvp 下面的 RangeSubsetKvpParser.
    在这里插入图片描述
    以上两点在 MR小白菜博文中也有提及,感谢他。

6.修改启动端口

6.1传统方式

  修改【gs-web-app】包中的 org.geoserver.web.Start.java ,我把端口改为了8090:
在这里插入图片描述

6.2 jetty方式

  找到【gs-web-app】的pom,搜索jetty.port,更改端口号
在这里插入图片描述

7.启动

7.1 传统方式

  这没什么好说的,直接点击工具条的debug按钮,或者run按钮,就可以运行了,当然此时使用的端口是6.1节设置的端口

7.2 jetty方式

  也许有人会问,为什么能用 jetty 运行?因为 GeoServer 源码中引用了一个 jetty 服务器的插件,首先cd到【gs-web-app】所在的目录,然后mvn jetty:run即可。同样,此时使用的是6.2节设置的端口。

cd web/app
mvn clean jetty:run
//如果是离线环境,则加上-o,表示offine,即离线,可避免去下一堆xml文件
mvn clean -o jetty:run

看到这里是不是有人就会有疑问,那岂不是说,GeoServer可以同时以两个端口运行?是的,没错,你说对了,确实是这样。you got it!

8.允许跨域访问

  如果你只是自己看下效果,那GeoServer里面的页面就能满足你的需求,你不需要做任何跨域访问的设置,但我需要在openlayers里调用服务,所以必须允许跨域访问。还是在【gs-web-app】包,找到src/main/webapp/WEB-INF/web.xml,搜索cors,将 org.eclipse.jetty.servlets.CrossOriginFilter 处理的那一段跨域注释放开:
在这里插入图片描述
org.apache.catalina.filters.CorsFilter 处理的那一段原封不动,保持原样:
在这里插入图片描述
最后,将所有请求都允许跨域的注释也放开:
在这里插入图片描述

9.解决log4j日志报错

  如果在启动过程中遇到了 Could not configure log4j overrides 错误,那是由于找不到 logging.xml 文件导致的。
在这里插入图片描述
  这个文件在我们 down 下来的源码的 data/minimal 文件夹中,复制这个文件,放到我们第在第 3 步中设置的 GEOSERVER_DATA_DIR 文件夹中就可以了。
在这里插入图片描述
至此,就大功告成了,再次编译启动!

10.运行效果

在这里插入图片描述

11.总结

  其实搭建开发环境里面,也没有多么复杂的操作,但是可能对于一个java新手,或者从没搞过gis的计算机人员来说,稍微有点陌生,希望本文能对他们有一些帮助,下期见~。

12.后记:解决 no version available for xxx.jar 等找不到包的问题

  很多人问我找不到包的问题怎么解决,首先有一些包是要 fan 墙才能下载的,所以大家要学会科学上网,还有的问题是,明明包存在,但是 maven 读不出来,那就把仓库里的 jar 包清理一下,具体就是将 .lastUpdated 、.sha1、.repositories 文件都删掉,然后重新导入就行,因为他们会干扰 maven 读包。
  科学上网还是找不到 GeoTools 包的同学可以到这里看看GeoTools官网,如果遇到了找不到的包就换个版本吧,不能在一棵树上吊死。
  很多人maven 的配置不正确,因为他们的 aliyunmirrorOf“ * ” ,但很多包并没在 aliyun 的镜像里,我们来看看有哪些包?打开GeoServer根目录下的pom,查看 repository 配置。发现其中配置了三个仓库,分别是 osgeo-releases 、osgeo-snapshots 、geosolutions

  <repositories>
    <repository>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>osgeo-releases</id>
      <name>OSGeo Nexus Release Repository</name>
      <url>https://repo.osgeo.org/repository/release/</url>
    </repository>

    <repository>
      <releases>
        <enabled>false</enabled>
      </releases>
      <!-- contains snapshots               -->
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
      <id>osgeo-snapshots</id>
      <name>OSGeo Nexus Snapshot Repository</name>
      <url>https://repo.osgeo.org/repository/snapshot/</url>
    </repository>

    <repository>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
      <id>geosolutions</id>
      <name>geosolutions repository</name>
      <url>https://maven.geo-solutions.it/</url>
    </repository>
  </repositories>

所以,我们的settings.xml,不要让maven 去阿里云的镜像去找这些包

  <mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>*,!geosolutions,!osgeo-releases,!osgeo-snapshots</mirrorOf> 
    </mirror>
  </mirrors>

更多精彩内容见公众号AIGIS

;