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包即可,分兩步替換:
- 下載下來之后對照geoserver發行版本中的jetty jar包進行選擇替換,總共需要13個jar包
- 然后將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的版本,沒辦法,只能繼續查找原因。
然后找到如下解決方法:
- 刪除C:\Windows\System32目錄下的java.exe、javaw.exe、javaws.exe三個文件(如果沒有就不用刪)
- 刪除環境變量Path中C:\ProgramData\Oracle\Java\javapath的配置
我在system32中沒有發現這些文件,在path中發現了javapath的配置,果斷刪除,重新進入cmd測試,jdk版本就切換過來了。