Openfire APNS插件设置页空白及NoSuchMethodError异常求助
这个问题我之前帮朋友处理过类似的,核心是Servlet/JSP版本不兼容导致的NoSuchMethodError(你的日志截断了,但大概率是这个错误),咱们一步步来拆解排查:
错误根源分析
javax.servlet.jsp.JspFactory.getJspApplicationContext这个方法是JSP 2.1规范(对应Servlet 2.5)才引入的,出现找不到的情况,无非两种原因:
- Openfire 3.9.3本身内置的Servlet/JSP版本低于2.1,和插件编译时依赖的版本不匹配;
- 你手动添加的
servlet.jar 2.5和Openfire内置的Servlet/JSP库发生了类加载冲突,导致系统加载了旧版本的JspFactory类。
具体排查修复步骤
1. 确认Openfire内置的Servlet/JSP版本
先去Openfire安装目录下的lib文件夹,找到jsp-api-*.jar和servlet-api-*.jar,查看它们的版本号(比如可能是jsp-api-2.0.jar、servlet-api-2.4.jar)。Openfire 3.9.3是2014年的老版本,大概率用的是Servlet 2.4/JSP 2.0规范,这和你用的Servlet 2.5就产生了版本差。
2. 修复插件的依赖冲突
如果你的openfire-apns.jar里打包了Servlet/JSP相关的jar包(比如jsp-api.jar、servlet-api.jar),请按以下操作:
- 解压
openfire-apns.jar,删除里面的Servlet/JSP相关jar; - 重新打包成jar文件,替换Openfire插件目录里的原文件;
- 重启Openfire,让插件使用Openfire内置的Servlet/JSP库。
3. 重新编译适配版本的插件(如果有源码)
如果你能拿到openfire-apns插件的源码,建议重新编译适配Openfire 3.9.3的版本:
- 在插件的构建配置(比如Maven的
pom.xml)里,把Servlet和JSP的依赖版本改成和Openfire内置一致的; - 给这些依赖加上
<scope>provided</scope>,确保打包时不会把这些API jar包打进插件里,避免和Openfire核心冲突; - 编译后重新部署插件并重启Openfire。
4. 检查JSP页面的兼容性
如果插件的设置页面用了JSP 2.1的新特性(比如EL表达式的高级用法),在JSP 2.0环境下也会报错。这种情况需要修改JSP页面,去掉JSP 2.1专属的语法,或者调整页面的指令(比如<%@ page isELIgnored="false" %>这类)。
额外提醒
Openfire 3.9.3版本太老了,后续可能还会遇到其他兼容性问题,如果条件允许,建议升级到更稳定的新版本Openfire,再搭配对应版本的APNS插件,能减少很多这类版本冲突问题。
内容的提问来源于stack exchange,提问作者Krishnan V S

