Geoserver是我们常用的地图服务器,在开源系统中的应用比较广泛。在实际环境中,我们可能会选用官方的二进制安装包进行部署,这样只要服务器上有java环境就可以运行,方便在现场进行部署。
1.问题来源
这次由于甲方一月一次的漏洞扫描,爆出了jetty的漏洞,搜索得知jetty 9.4.53版本之下的jetty都会受到影响,而现场的geoserver版本已经是2.24.0版本的了,其jetty版本是9.4.52版本,非常尴尬,还得升级。去geoserver官网查找最新版本是2.24.1,下载下来一看,jetty版本仍然是9.4.52,这就尬住了,官方也没有去解决这个问题,只能自己硬着头皮去替换jetty的jar包了。
2.问题解决
之前在解决geoserver jetty漏洞的问题时,我曾经采用替换lib包里的jetty包和外面的start.jar文件来进行修复,现在故技重施,解决思路也是奔着这个目标去。
首先,替换lib包中的jetty包,jetty的包要去jetty官网下载jetty官网下载
直接下载zip包即可,分两步替换:
然后将jetty中的start.jar包也替换到geoserver发行包中
start.ini是jetty的启动配置文件,之前在使用高版本geoserver替换低版本geoserver时需要一并替换,但是现在使用的jetty的官方包替换,这里替换掉之后会丢掉geoserver中的很多配置,所以这里并没有做替换。
替换完成之后就可以去启动试一下了,果然事情不是那么顺利的,报错了
java.lang.UnsupportedClassVersionError: org/geoserver/GeoserverInitStartupListener has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
百度一下发现是java版本的事情,因为我们替换的jetty包是高版本java编译的,所以运行环境也只能使用高版本的java,java版本和这上面的version的对应关系如下:
由上图可知,我们的java版本最低也要升级到java11了,去JDK的下载页面查看,发现现在推荐的版本最低都是17了,那那就下载17用吧,反正是向下兼容的。
于是在本地电脑上安装17来测试,发现可以正常运行,大工告成。
3.JDK多版本安装的小插曲
在本地测试安装多版本JDK的过程中,还遇到了JAVA_HOME已经修改成jdk17的版本了,但去cmd中一试还是jdk8版本:
于是排查自己的修改,发现path中bin目录的配置还是用的原来jdk8的目录,于是修改,再次测试,还是jdk8的版本,没办法,只能继续查找原因。
然后找到如下解决方法:
我在system32中没有发现这些文件,在path中发现了javapath的配置,果断删除,重新进入cmd测试,jdk版本就切换过来了。