GeoServer: Error obtaining new data store
系统环境
-
银河麒麟V10
适用范围
该解决方案可能只适用于如下错误日志。
排查过程
前两天部署自己构建的GeoSever 到麒麟系统上,新建数据源出现 Error obtaining new data store ,但是在本地、linux虚拟机、Windows Server上运行都是好的,查阅日志发现一条关键信息 No native library found for os.name-Linux, os.arch=aarch64
难道是系统指令集不兼容?查了下麒麟系统是aarch64,而本地测试正常的都是x64
我一想这java不是跨平台吗。。。想起之前用node pkg打包可执行文件,x64系统不能打包也是不能打包arm的,要在arm上打包才能构建arm的可执行文件,尝试直接在麒麟上打包了一下,构建产物一看大小跟之前没有变化,估计不行,一试果然不行。。。 通过日志初步判断是sqlite依赖应该有问题,先在网上查查有无好的解决方案,
- 百度一下,知乎上找见了一篇文章,情况跟我差不多,确实是sqllite有问题,最后对应的so没有用arm的补了一个上去
- google一下,github issue找了个相关的,https://github.com/apache/maven-mvnd/issues/474,也是一样
那操作一下吧,直接从源码改我感觉还是挺麻烦的。
GeoServer并没有直接依赖sqlite-jdbc,war包应该有最终的所有依赖,进war 里面找找,果然, WEB-INFlib 下面找到了各种jar包,其中一个就是 sqlite-jdbc3.34.0,直接去github上拉一个最新的sqlite-jdbc-3.41下来,我寻思2023年了还能不支持aarch64? 结果替换下来一部署还是不行,这就起了个怪了,就按查到的解决方案先试试吧,但是源码一看,这不是有aarch64吗…我也是很奇怪啊,难道是版本不兼容?
切到3.34.0的tag,一看还是有啊… 我又仔细看了下日志,No native library… 没找到… … … … 难不成路径有问题啊,莫非这是按系统的绝对路径来读的?paths应该是查找so的所有路径, 直接copy最新的so到 /usr/lib 下面,再次新建数据源,这下不报 Error obtaining new data store 了,查日志找不到什么什么class… … 盲猜版本不对,换个同版本的so到/usr/lib下面,至此,问题解决…
后来又试了下官方构建的war包啊,,也是不行
步骤总结
使用解压缩软件如(WinRAR) 解压geoserver.war,进入WEB-INF/lib下面,
找到 sqlite-jdbc 的jar包,如图版本为3.34.0, 进入 https://github.com/xerial/sqlite-jdbc/tags 找到版本一致的tag,
下载 src/main/resources/org/sqlite/native/Linux/aarch64/libsqlitejdbc.so 至麒麟系统的 /usr/lib/libsqlitejdbc.so
再次添加即可成功。
注意一定要版本一致,否则很有可能会出现其它错误
另一种解决方案
构建二进制版本,但是我没在文档找见该怎么构建这个,貌似加个-Drelease参数就可以?好吧,对这个不是很熟悉,先不搞了… …
最后再问问可爱的猫娘(