Eclipse部署Project A到Tomcat9时出现Project B类找不到错误求助
我之前也碰到过完全一样的坑——用Eclipse里的项目依赖代替打包好的jar时,Tomcat经常会“漏掉”把依赖项目的类文件部署进去。结合你遇到的java.lang.NoClassDefFoundError错误,给你几个针对性的解决步骤:
1. 检查Deployment Assembly配置(最关键)
这是90%以上这类问题的根源。操作步骤:
- 右键点击Project A → 选择
Properties - 在弹出的窗口里找到
Deployment Assembly选项卡 - 看看列表里有没有包含Project B:
- 如果没有,点击
Add→ 选择Project→ 选中Project B → 确认添加
这个配置的作用就是告诉Eclipse:部署Project A的时候,要把Project B的编译产物一起打包到Tomcat的部署目录里。
- 如果没有,点击
2. 验证Project B的编译状态
有时候Project B本身编译失败了,但你没留意,自然生成不了需要的class文件:
- 右键Project B → 选择
Project→Clean,先清理旧的编译文件 - 然后重新编译:
Project→Build Project - 去Project B的
bin目录(或者你自定义的输出目录)里,确认有没有那个找不到的className.class文件
3. 手动检查Tomcat部署目录
去你的Tomcat安装目录下的webapps文件夹,找到Project A的部署文件夹,打开WEB-INF目录:
- 如果是项目依赖,正常情况下应该能在
classes目录里看到Project B的类文件,或者如果Project B是打包成jar的话会在lib目录里 - 如果没有,说明Eclipse的部署流程没把依赖项传过去,回到第一步重新配置Deployment Assembly
4. 确认构建路径的依赖范围
右键Project A → Properties → Java Build Path → Projects选项卡:
- 选中Project B,点击
Edit - 检查依赖范围是不是
Compile(默认应该是这个),别选成Provided或者其他,否则部署时不会把依赖项包含进去
附你提供的错误日志:
Mar 23, 2018 9:37:07 AM org.apache.catalina.core.ApplicationContext log
SEVERE: StandardWrapper.Throwable
java.lang.NoClassDefFoundError: className
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:571)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:490)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:474)
内容的提问来源于stack exchange,提问作者sub

