Tomcat v9.0应用遇HTTP 500错误:NoClassDefFoundError(com/restfb/FacebookClient)
解决Tomcat运行Servlet时出现
java.lang.NoClassDefFoundError: com/restfb/FacebookClient的问题 嘿,这个问题我太熟了!你遇到的HTTP 500错误里的NoClassDefFoundError,核心原因就是Tomcat在运行你的Servlet时,找不到restFB库的相关类文件。你在非服务器项目里测试正常,是因为那时候jar包已经被正确加入到项目的类路径中,但放到Tomcat环境下跑时,jar包的位置不对或者没被正确部署,导致类加载失败。
下面给你一步步的解决方法:
把restFB jar包放到正确的位置
Web项目的依赖jar包必须放在项目的WEB-INF/lib目录下,这是Tomcat默认会扫描加载类的路径。如果之前你只是把jar包添加到IDE的编译路径(比如Eclipse的Build Path),但没复制到WEB-INF/lib,Tomcat部署时不会自动包含这些jar包,自然找不到类。
操作:找到restFB的jar包(包括它可能依赖的其他jar包,比如JSON处理相关的),复制到项目根目录下的WEB-INF/lib文件夹里(如果没有lib目录就新建一个)。检查IDE的部署配置
如果你用IDE(比如Eclipse、IntelliJ)直接部署到Tomcat,要确保IDE会把WEB-INF/lib里的jar包一起部署:- Eclipse:右键项目 → Properties → Deployment Assembly,检查是否包含
WEB-INF/lib,如果没有就点击Add → Java Build Path Entries → 选中restFB的jar包添加进去。 - IntelliJ:打开Project Structure → Artifacts,找到你的Web项目的Artifact,确保
WEB-INF/lib下包含restFB的jar包,没有的话就从Libraries里添加。
- Eclipse:右键项目 → Properties → Deployment Assembly,检查是否包含
清理Tomcat缓存并重启
有时候Tomcat的缓存会残留旧的部署文件,导致新添加的jar包没被加载:- 停止Tomcat服务;
- 删除Tomcat安装目录下
work文件夹里的所有内容; - 如果是手动部署war包,删除
webapps目录下对应的项目文件夹和旧war包; - 重新部署你的项目,再启动Tomcat。
Maven/Gradle项目的额外检查
如果你的项目是用构建工具管理的:- Maven:确保restFB的依赖范围是
compile(默认就是这个范围),这样打包时Maven会自动把jar包放到WEB-INF/lib里,示例依赖配置:<dependency> <groupId>com.restfb</groupId> <artifactId>restfb</artifactId> <version>你的版本号</version> </dependency> - Gradle:依赖范围用
implementation或者compile,示例:implementation 'com.restfb:restfb:你的版本号'
- Maven:确保restFB的依赖范围是
完成这些步骤后,再点击按钮调用Servlet,应该就能正常加载restFB的类,解决这个500错误了。
内容的提问来源于stack exchange,提问作者FpRoT




