前言: 上一篇中我们说到了改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 代码
GeoServer在GitHub上的地址为: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官网给出了两个解决方法。
- 安装error-prone插件,并将默认编译器javac改为errorprone
- 在maven的Profiles中取消勾选errorprone和errorprone8
经过我的实验,方法2 比方法1 效果好,因为方法1即使设置了error-prone为默认编译器,有时候会自动又改回javac,具体原因我没找到,哪位有识之士知道的话可以告诉我一声。
5.添加引用与注释代码
- 添加 org.geoserver.wcs.kvp.rangesubset 下 AbstractContentNode 的NODE引用
- 注释掉 org.geoserver.wcs.kvp 下面的 RangeSubsetKvpParser.
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 的配置不正确,因为他们的 aliyun 的 mirrorOf 是 “ * ” ,但很多包并没在 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>