本地GeoServer执行GetCapabilities报错,无法连接QGIS求助
解决GeoServer在OpenJDK17下GetCapabilities报错及客户端连接失败问题
问题原因
这个错误由Java 9及以上版本的模块系统(JPMS)限制导致:org.marlin.pisces.MarlinRenderingEngine属于未命名模块,它试图访问的sun.java2d.pipe.RenderingEngine是java.desktop模块的内部API,默认情况下该模块不会将这个包导出给未命名模块,从而触发非法访问错误。Web界面正常是因为它未触发WMS服务所需的渲染逻辑,而GetCapabilities请求或客户端连接会触发该逻辑。
解决方案
方案1:添加JVM模块访问参数
修改GeoServer的启动脚本(Ubuntu系统对应bin/startup.sh),在JAVA_OPTS中添加参数,允许未命名模块访问java.desktop的内部包:
JAVA_OPTS="$JAVA_OPTS --add-exports=java.desktop/sun.java2d.pipe=ALL-UNNAMED" JAVA_OPTS="$JAVA_OPTS --add-opens=java.desktop/sun.java2d.pipe=ALL-UNNAMED"
操作步骤:
- 打开GeoServer安装目录下的
bin/startup.sh文件 - 找到定义
JAVA_OPTS的段落,将上述两行追加到现有参数后 - 保存文件,重启GeoServer服务
方案2:禁用Marlin渲染引擎,使用默认渲染器
如果不想调整模块权限,可直接切换回Java默认渲染引擎:
- 在启动脚本的
JAVA_OPTS中添加参数:
JAVA_OPTS="$JAVA_OPTS -Dsun.java2d.renderer=sun.java2d.pipe.AAShapePipe"
- 或者删除GeoServer安装目录下
WEB-INF/lib中所有以marlin开头的jar文件(如marlin-*.jar),再重启GeoServer
验证
重启GeoServer后,重新执行GetCapabilities请求,确认返回正常XML响应,再尝试用QGIS连接,即可正常访问图层。
内容的提问来源于stack exchange,提问作者minisaurus
相关产品推荐
相关产品推荐

