You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:32:09