Payara 4.1部署Web应用失败:java.lang.NoSuchMethodError报错求助
解决Payara 4.1部署时
java.lang.NoSuchMethodError的问题 这个错误我之前帮不少开发者排查过,本质就是运行环境的JSF版本和PrimeFaces 6.2的依赖要求不匹配导致的:
addSearchKeywordResolver这个方法是JSF 2.3规范里才新增的API,但Payara 4.1默认集成的是JSF 2.2版本,根本没有这个方法。- 虽然PrimeFaces 6.2官方标注支持JSF 2.2+,但它内部部分功能偷偷依赖了JSF 2.3的API,跑到JSF 2.2的环境下自然就找不到方法了。
下面给你几个可行的解决方案,你可以根据自己的情况选择:
方案1:直接升级Payara到支持JSF 2.3的版本
Payara 4.x系列最高只支持JSF 2.2,你可以升级到Payara 5.x版本——它默认就集成了JSF 2.3,完美匹配PrimeFaces 6.2的需求,而且Payara 5.x对Java EE 8的支持更完善,后续踩兼容性坑的概率也更低。
方案2:降级PrimeFaces到适配JSF 2.2的版本
如果暂时不想折腾服务器升级,那就把PrimeFaces版本降到6.1或者更早。PrimeFaces 6.1及之前的版本是完全基于JSF 2.2开发的,没有用到JSF 2.3的新API,在Payara 4.1上跑肯定没问题。
方案3:排查项目里的JSF依赖冲突
你说之前成功部署过,那大概率是后来项目里加了额外的JSF依赖(比如javax.faces-api或者jsf-impl),导致打包到WAR里的JSF API和Payara自带的JSF 2.2版本“打架”了。你可以这么做:
- 打开项目的依赖管理文件(Maven的
pom.xml或者Gradle的build.gradle) - 要么删掉所有手动添加的JSF依赖,要么把它们的scope改成
provided——意思是让服务器来提供运行时的JSF版本,不要自己打包进去
举个Maven的例子,如果你之前加了JSF依赖,应该改成这样:
<dependency> <groupId>javax.faces</groupId> <artifactId>javax.faces-api</artifactId> <version>2.3</version> <scope>provided</scope> <!-- 交给Payara提供,不打包到WAR里 --> </dependency>
不过要注意,这个方案只能解决依赖冲突的问题,PrimeFaces 6.2依赖JSF 2.3的核心问题还是存在的,所以更推荐你选方案1或者2。
内容的提问来源于stack exchange,提问作者Guido
相关产品推荐
相关产品推荐

