Web应用在Eclipse+Glassfish 4.1中正常运行,部署到Tomcat 9后异常
这个问题我之前帮朋友排查过,核心原因其实是Tomcat和GlassFish的定位差异——你踩了一个很常见的Java EE容器误区!
核心问题:Tomcat本身不支持EJB
GlassFish是完整的Java EE应用服务器,内置了EJB(Enterprise JavaBeans)容器,能处理EJB的创建、注入、生命周期管理等逻辑;但Tomcat只是一个轻量级的Servlet/JSP容器,它只实现了Java EE中的Servlet和JSP规范,完全不支持EJB相关功能。
你的Servlet里大概率用了@EJB注解来注入EJB实例,或者直接依赖了EJB的API/实现类,Tomcat启动时既无法识别@EJB注解,也找不到EJB容器来创建对应的Bean实例,最终就会抛出类似截图里的类找不到或者依赖注入失败的错误。
具体解决方案(按推荐优先级排序)
方案1:改用支持Java EE的应用服务器
如果你不想修改代码,最简单的办法就是放弃Tomcat,继续用GlassFish,或者换成WildFly、Payara这类完整的Java EE应用服务器,它们都原生支持EJB,直接部署你的WAR包就能正常运行。方案2:重构代码移除EJB依赖
如果你坚持要使用Tomcat,需要把业务逻辑从EJB中迁移出来:- 删除EJB相关的注解(比如
@Stateless、@EJB) - 将原EJB中的业务逻辑封装成普通的Java类
- 在Servlet中直接实例化这些普通类,或者用简单的依赖注入工具(比如Google Guice)来管理实例
- 如果用到了EJB的事务管理,可以改用JDBC事务或者Spring的事务管理来替代
- 删除EJB相关的注解(比如
方案3:给Tomcat添加EJB支持(不推荐新手)
你可以使用TomEE(Apache Tomcat的Java EE增强版),它是在Tomcat基础上集成了OpenEJB等Java EE组件,原生支持EJB。或者手动给Tomcat集成OpenEJB容器,但配置步骤比较繁琐,容易出问题,适合有一定经验的开发者。
内容的提问来源于stack exchange,提问作者AlexScalar

