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


目录

  • 快速导航
  • 1.上 GitHub down 代码
  • 2.使用IDEA导入项目
  • 3.配置启动环境
  • 4.开始编译
  • 5.添加引用与注释代码
  • 6.修改启动端口
  • 6.1传统方式
  • 6.2 jetty方式
  • 7.启动
  • 7.1 传统方式
  • 7.2 jetty方式
  • 8.允许跨域访问
  • 9.解决log4j日志报错
  • 10.运行效果
  • 11.总结
  • 12.后记:解决 no version available for xxx.jar 等找不到包的问题

1.上 GitHub down 代码

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

geoserver 发布 mysql 表 geoserver开发_noSuchMethod

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

2.使用IDEA导入项目

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

geoserver 发布 mysql 表 geoserver开发_GeoServer_02

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

3.配置启动环境

  点击EditConfigurations,打开配置框,然后点击左侧加号,选择新建Application

geoserver 发布 mysql 表 geoserver开发_环境_03


之后修改各配置项如下:

geoserver 发布 mysql 表 geoserver开发_noSuchMethod_04

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.

6.修改启动端口

6.1传统方式

  修改【gs-web-app】包中的 org.geoserver.web.Start.java ,我把端口改为了8090:

geoserver 发布 mysql 表 geoserver开发_环境_05

6.2 jetty方式

  找到【gs-web-app】的pom,搜索jetty.port,更改端口号

geoserver 发布 mysql 表 geoserver开发_环境_06

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 处理的那一段跨域注释放开:

geoserver 发布 mysql 表 geoserver开发_GeoServer_07


org.apache.catalina.filters.CorsFilter 处理的那一段原封不动,保持原样:

geoserver 发布 mysql 表 geoserver开发_开发_08


最后,将所有请求都允许跨域的注释也放开:

geoserver 发布 mysql 表 geoserver开发_GeoServer_09

9.解决log4j日志报错

  如果在启动过程中遇到了 Could not configure log4j overrides 错误,那是由于找不到 logging.xml 文件导致的。

geoserver 发布 mysql 表 geoserver开发_开发_10


  这个文件在我们 down 下来的源码的 data/minimal 文件夹中,复制这个文件,放到我们第在第 3 步中设置的 GEOSERVER_DATA_DIR 文件夹中就可以了。

geoserver 发布 mysql 表 geoserver开发_GeoServer_11


至此,就大功告成了,再次编译启动!

10.运行效果

geoserver 发布 mysql 表 geoserver开发_GeoServer_12

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>