求助:Tomcat无法找到freemarker.template.TemplateException类
解决Tomcat找不到freemarker.template.TemplateException的问题
这个问题我之前也碰到过,大概率是类加载器的问题或者Freemarker依赖在Web环境下的部署配置不对,咱们一步步来排查:
1. 优先检查Web应用的依赖部署位置
首先得确认你的Freemarker jar包是不是真的被放到了Web应用的WEB-INF/lib目录下:
- 本地main函数运行时,依赖是直接加载项目classpath里的jar,但Tomcat加载Web应用时,只会识别
WEB-INF/lib目录下的依赖,以及Tomcat全局lib目录里的jar。如果你的Freemarker依赖只在项目编译路径里,没被打包到WEB-INF/lib,Tomcat肯定找不到这个类。 - 如果你用Maven/Gradle构建项目,要确保Freemarker依赖的scope是
compile(默认就是这个值),千万别设成provided或者test——这两个scope的依赖不会被打包到WEB-INF/lib里,provided是假设服务器已经自带了该依赖,但显然你的Tomcat并没有预装Freemarker。
举个Maven依赖的正确配置例子:
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>你的具体版本号</version> <!-- 这里不需要额外加scope,默认compile即可 --> </dependency>
2. 排查类加载器冲突问题
有时候Tomcat全局的CATALINA_HOME/lib目录里如果存在旧版本的Freemarker,或者你的Web应用其他依赖引入了冲突的Freemarker版本,会导致Web应用的类加载器加载到错误的版本,进而找不到需要的TemplateException类:
- 先检查Tomcat全局lib目录里有没有freemarker相关的jar文件,如果有,要么直接删除(让Web应用使用自己打包的版本),要么确保全局版本和你项目里的版本完全一致。
3. 验证打包后的war包完整性
有时候打包过程可能会出现遗漏,你可以手动解压生成的war包,查看WEB-INF/lib目录下是否存在freemarker-x.x.x.jar(x为你的版本号):
- 如果没有,重新执行打包命令,比如Maven的
mvn clean package,Gradle的gradle clean war,确保打包过程没有报错。
4. 查看完整的异常堆栈信息
你提供的异常堆栈被截断了,完整的堆栈信息能帮我们更精准定位问题:
- 如果是
ClassNotFoundException,基本就是依赖没部署到位;如果是NoClassDefFoundError,通常是编译时存在该类,但运行时找不到,或者Freemarker依赖的其他基础类缺失,这时候需要检查Freemarker的依赖链是否完整。
先从WEB-INF/lib的依赖检查入手,这是最常见的原因,如果还是不行,再逐一排查类加载器冲突和版本问题。
内容的提问来源于stack exchange,提问作者Viktor Kulikov
相关产品推荐
相关产品推荐

