开发环境:
- Idea 2021.3.3 Ultimate
- Tomcat 8.0.21
问题复现
自定义了一个ES查询函数EsQuery,使用的业务场景是在servlet中调用,然后获取数据,发现在本地调试的时候可以执行。
下面是本地测试代码和运行结果:
public class Test {
public static void main(String[] args) throws IOException {
EsQuery esQuery = new EsQuery();
List list = esQuery.esQuery();
System.out.println(list);
}
}
输出如下:
在servlet中编写以下代码,发现编译能够通过,但是运行时会报错:
System.out.println("123");
EsQuery esQuery = new EsQuery();
List list = esQuery.esQuery();
而在启动web项目之后前端报500错误,后端使用单步调试发现如下错误:
也就是NoClassDefFoundError,为找到对应的类定义,而编译确实能够通过,问题出在哪里?
解决思路
Tomcat构件使用的是默认的,没有能够包含maven依赖
进入File-Project Structure-Artifacts
发现当前使用的构件确实没有包含maven依赖中的包,难怪会找不到:
从模块新建一个构件:
这次WEB-INF-lib目录下有了maven管理的依赖包
接着在Tomcat中配置该构件:
编辑服务器配置,选择服务器Tomcat,Deployment选择刚才新建的构件,可以把之前的都删掉了:
只留下一个刚才新建的构件:
发现控制台也能够正常输出查询到的信息,且前端不再报错500:
参考资料
[1]: http://t.csdn.cn/c7gZl
[2]:http://t.csdn.cn/noVoY