在Apache TomEE 10+部署同内容WAR副本遇DuplicateDeploymentIdException求助
解决TomEE 10+中部署相同内容WAR的DuplicateDeploymentIdException问题
问题原因
TomEE内置的OpenEJB默认基于EJB的类名、包路径等信息生成部署ID,当两个WAR包含完全相同的EJB时,生成的部署ID会重复,从而触发DuplicateDeploymentIdException。
解决方案
1. 全局配置TomEE,让部署ID包含应用标识
修改TomEE安装目录下的conf/openejb.xml文件,调整容器配置,让OpenEJB生成部署ID时自动带上应用名称前缀,避免重复:
<Container id="Default Stateless Container" type="STATELESS"> <Property name="deploymentIdFormat">{appId}/{ejbName}</Property> </Container>
如果使用有状态EJB,需对Default Stateful Container做同样的配置调整。
2. 在WAR包内自定义EJB部署ID
在每个WAR的WEB-INF/openejb-jar.xml文件中,为每个EJB手动指定唯一的部署ID。示例:
第一个WAR(webapi.war)的配置:
<openejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="8.0"> <enterprise-beans> <session> <ejb-name>YourStatelessEJB</ejb-name> <ejb-class>com.yourpackage.YourStatelessEJB</ejb-class> <session-type>Stateless</session-type> <deployment-id>webapi-your-ejb</deployment-id> </session> </enterprise-beans> </openejb-jar>
第二个WAR(webapi1.war)的配置,只需修改deployment-id值:
<deployment-id>webapi1-your-ejb</deployment-id>
3. 使用注解动态指定部署ID
在EJB类上通过@DeploymentId注解设置可动态替换的部署ID,打包时通过构建参数区分两个WAR:
import org.apache.openejb.api.DeploymentId; import jakarta.ejb.Stateless; @Stateless @DeploymentId("${ejb.deployment.id}") public class YourStatelessEJB { // EJB业务逻辑 }
打包第一个WAR时,设置构建参数ejb.deployment.id=webapi-your-ejb;打包第二个WAR时,设置参数为ejb.deployment.id=webapi1-your-ejb,即可自动生成不重复的部署ID。
内容的提问来源于stack exchange,提问作者aditya
相关产品推荐
相关产品推荐

