使用嵌入式Tomcat服务器时遭遇NoClassDefFoundError错误求助
解决嵌入式Tomcat运行时ClassNotFoundException问题
问题根源
执行java -jar target\employees-app-1.0.jar时出现NoClassDefFoundError,核心原因是默认Maven打包生成的jar不包含依赖库,Tomcat嵌入式核心类不在运行时的classpath中。
解决方案:构建包含所有依赖的可执行Jar
使用maven-shade-plugin插件打包,它会把项目所有依赖合并到一个可执行Jar里,解决类找不到的问题。
- 在
pom.xml的<build><plugins>节点下,添加/替换为以下插件配置(原有的tomcat6/7 maven插件是用于部署到外部Tomcat,和嵌入式Tomcat无关,可保留或删除):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 替换成你自己的主类(启动嵌入式Tomcat的入口类) --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> </transformers> <!-- 可选:过滤重复签名文件,避免打包冲突 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
- 重新执行打包命令:
mvn clean package
- 运行生成的包含所有依赖的Jar包(默认生成的Jar名称为
employees-app-1.0-shaded.jar,可通过插件<finalName>自定义):
java -jar target/employees-app-1.0-shaded.jar
额外检查点
- 确保Tomcat嵌入式依赖(
tomcat-embed-core等)的scope为compile(默认无需额外指定,不要设为provided或test)。 - 确认主类正确导入
org.apache.catalina.startup.Tomcat并完成嵌入式Tomcat的初始化逻辑。
内容的提问来源于stack exchange,提问作者quldude
相关产品推荐
相关产品推荐

