含EJB客户端JAR的Web应用在TomEE9中被部署EJB的问题咨询
问题分析与解决
你的问题核心在于TomEE的默认扫描机制,以及你对EJB客户端JAR的使用偏差:
TomEE的默认行为
TomEE会自动扫描Web应用类路径(包括WEB-INF/lib下的所有JAR)中带有EJB注解(比如@Stateless、@Stateful)的类,只要发现这类类,就会将其部署为服务器端EJB Bean——不管这个JAR原本的定位是客户端。操作偏差点
你口中的"EJB客户端JAR"实际上包含了完整的EJB实现类(带服务器端EJB注解),但标准的EJB客户端JAR应该只保留EJB接口(远程/本地接口),不能包含带@Stateless这类服务器端注解的实现类。这就是TomEE误将其部署为服务器端EJB的原因。
解决办法
方法一:修正客户端JAR内容
重新构建你的EJB客户端JAR,只保留EJB的接口文件,移除所有带有服务器端EJB注解的实现类。这样TomEE扫描时就不会识别到可部署的EJB Bean。
方法二:配置TomEE跳过扫描该JAR
如果无法修改客户端JAR,可以通过配置让TomEE忽略这个JAR的EJB扫描:
- 在Web应用的
WEB-INF/web.xml中添加配置:
<context-param> <param-name>openejb.deployments.classpath.exclude</param-name> <param-value>你的客户端JAR文件名.jar</param-value> </context-param>
- 或者在TomEE的
tomee.xml中针对目标Web应用添加配置:
<Deployments dir="webapps/你的应用名" excludeJars="你的客户端JAR文件名.jar"/>
相关日志
Jun 21, 2023 2:36:27 PM org.apache.openejb.assembler.classic.Assembler startEjbs INFO: Created Ejb(deployment-id=PaymentManagerBean, ejb-name=PaymentManagerBean, container=My Stateless Container) Jun 21, 2023 2:36:27 PM org.apache.openejb.assembler.classic.Assembler startEjbs INFO: Created Ejb(deployment-id=IRMTransactionManagerBean, ejb-name=IRMTransactionManagerBean, container=My Stateless Container) Jun 21, 2023 2:36:27 PM org.apache.openejb.assembler.classic.Assembler startEjbs INFO: Created Ejb(deployment-id=GraphManagerBean, ejb-name=GraphManagerBean, container=My Stateless Container) Jun 21, 2023 2:36:27 PM org.apache.openejb.assembler.classic.Assembler startEjbs INFO: Created Ejb(deployment-id=ReportManagerBean, ejb-name=ReportManagerBean, container=My Stateless Container) Jun 21, 2023 2:36:27 PM org.apache.openejb.assembler.classic.Assembler startEjbs INFO: Created Ejb(deployment-id=DeviceManagerBean, ejb-name=DeviceManagerBean, container=My Stateless Container)
内容的提问来源于stack exchange,提问作者HockChai Lim
相关产品推荐
相关产品推荐

