升级Java 11后GeoServer 2.21.4在JBoss EAP 7.4.9带安全管理器部署失败
问题背景
在Java 8环境(Oracle JRE 1.8.0_351、JBoss EAP 7.4.9、Windows10)中,部署GeoServer 2.21.4并开启Security Manager,配置全权限后可正常启动。但升级到Java 11环境(Oracle JRE 11.0.20、Windows10)后,使用完全相同的全权限配置部署失败,抛出java.security.AccessControlException,提示缺少F:\NN\gis\geoserver\external\gwc-layers路径的read权限。即使显式添加该路径及相关文件权限,报错信息仍然一致。
可能原因分析
- Java 11权限检查逻辑变更:Java 11对Security Manager的权限规则做了严格调整,尤其是文件系统权限的匹配逻辑和模块系统的权限隔离。Java 8中
AllPermission可完全覆盖所有权限需求,但Java 11的模块系统会限制部分代码路径的权限继承,导致全权限配置失效。 - JBoss权限传递差异:JBoss EAP 7.4.9在Java 11环境下,部署单元的权限配置可能未正确应用到GeoServer的依赖模块(如GWC缓存模块),动态加载的资源路径权限未被覆盖。
- 文件权限粒度问题:Java 11不再默认递归匹配文件路径权限,单个路径的read权限无法覆盖其子目录或动态生成的文件访问需求。
解决方案
1. 确保JBoss部署单元权限关联正确
在JBoss的standalone.xml或domain.xml中,检查security-manager子系统配置,确保GeoServer的WAR包已关联全权限集合:
<subsystem xmlns="urn:jboss:domain:security-manager:1.0"> <deployment-permissions> <!-- 替换为实际的GeoServer WAR包名称 --> <deployment name="geoserver.war" permissions="all-permissions"/> </deployment-permissions> <permission-sets> <permission-set name="all-permissions"> <permission class="java.security.AllPermission"/> </permission-set> </permission-sets> </subsystem>
注意:Java 11环境下需确保该权限集合被正确应用到GeoServer的类加载上下文,避免模块隔离导致权限失效。
2. 添加递归文件系统权限
针对GeoServer的外部资源路径,添加递归权限配置(覆盖父路径下所有子目录和文件):
<permission-set name="geoserver-file-permissions"> <permission class="java.io.FilePermission" name="F:\NN\gis\geoserver\external\-" actions="read,write,delete"/> <!-- 可按需添加GeoServer数据目录等其他依赖路径 --> <permission class="java.io.FilePermission" name="F:\NN\gis\geoserver\data\-" actions="read,write"/> </permission-set>
将该权限集合同样关联到GeoServer的部署单元,补充或替代全权限配置。其中-符号表示递归匹配路径下所有内容,解决Java 11中单个路径权限无法覆盖子目录的问题。
3. 调整Java 11 Security Manager启动参数
在JBoss的启动脚本(如standalone.bat)中,显式设置Security Manager启用参数:
set "JAVA_OPTS=%JAVA_OPTS% -Djava.security.manager=allow"
Java 11中java.security.manager默认值为disallow,必须显式开启才能启用Security Manager,这是与Java 8的核心差异点。
4. 安装JBoss Java 11兼容补丁
确保JBoss EAP 7.4.9已安装针对Java 11的最新累积补丁,部分Security Manager与Java 11兼容的问题可能已在补丁中修复。
验证步骤
- 重启JBoss服务器,查看GeoServer部署日志,确认权限报错是否消失。
- 若仍有报错,检查JBoss的
server.log中的权限栈跟踪,定位具体未授权的代码路径,补充对应权限。 - 验证GeoServer的GWC模块是否能正常访问
gwc-layers路径下的缓存文件。
内容的提问来源于stack exchange,提问作者tungpham

