用途
TomEE Runtime 用于将使用 EJB 的 JavaEE 应用从 SAP BTP Neo 平台迁移到 Cloud Foundry 的 TomEE 10 容器,替代 Tomcat 迁移路径。当应用使用 EJB 功能时选择 TomEE。
适用检测条件
满足以下任一模式时适用:在 pom.xml 中引用 com.sap.cloud:neo-javaee7-wp-api 依赖;Java 源码中导入 javax.ejb.Stateless、javax.ejb.Singleton、javax.ejb.EJB、javax.ejb.Schedule,或使用对应注解;在 web.xml 或部署描述符中定义 EJB 引用(如 ejb-local-ref)。
前置条件
技能必须在应用的 -cf-migration 副本目录内运行,该目录由 jakarta-java25-migration 或 neo-to-cf-migration-orchestrator 创建。若当前目录不以 -cf-migration 结尾,需先切换。调用前必须先执行 jakarta-java25-migration 技能完成 Jakarta EE 10 迁移。
主要迁移步骤
Step 1:替换 Neo 依赖。使用 cf-tomee-bom 替代 cf-tomcat-bom,引入 com.sap.cloud.sdk.cloudplatform:scp-cf,并将 jakarta.jakartaee-api 声明为 provided 范围。版本通过 sdk-replacement 步骤 3 解析。
Step 2:迁移 EJB 注解。将 javax.ejb.* 与 javax.annotation.* 导入替换为 jakarta.ejb.* 与 jakarta.annotation.*,注解本身保持不变。
Step 3:创建 resources.xml 数据源配置。在 src/main/webapp/WEB-INF/resources.xml 中定义 Resource,使用 provider="xs.openejb:XS Default JDBC Database",service 占位符以元素内容而非 XML 属性形式指定。
Step 4:配置 persistence.xml 以适配 TomEE JTA。四项关键修改:将文件从 src/main/resources/META-INF/ 移到 src/main/webapp/META-INF/;显式声明 provider 为 org.eclipse.persistence.jpa.PersistenceProvider(TomEE 默认 OpenJPA);jta-data-source 使用短 JNDI 名 jdbc/DefaultDB(不带 java:comp/env/ 前缀);eclipselink.ddl-generation 使用 create-or-extend-tables。此外,HANA Cloud 对 NVARCHAR 限制 5000 字符,超出长度的 @Lob 字段需改用 columnDefinition = "NCLOB"。
硬性规则:使用 JPA/EJB 的应用必须有 HANA schema 服务,mtad 中必须包含 type: com.sap.xs.hana-schema 资源且模块 requires 它,否则数据源无法初始化,应用部署成功但启动崩溃。
Step 5:创建 resource_configuration.yml。路径为 tomee/webapps/ROOT/WEB-INF/resources.xml,service_name_for_DefaultDB 的值必须替换为真实应用名,且与 mtad 中绑定的 hana-schema 资源名完全一致。
Step 6:更新 MTA 描述符。模块类型仍为 java.tomcat,通过 TARGET_RUNTIME: tomee 属性启用 TomEE,JBP_CONFIG_RESOURCE_CONFIGURATION 使用 YAML 列表格式,路径使用 tomee/webapps/ROOT/WEB-INF。handler schema 资源不要添加 service 或 service-plan 键。
Step 7:移除 web.xml 中的 CXFNonSpringJaxrsServlet。该 Servlet 会直接实例化 JAX-RS 端点类,绕过 TomEE 的 CDI 容器,导致 @Inject、@EJB、@Resource 字段为 null。移除整个 servlet 与 servlet-mapping 块,并将 provider 注册迁移到 JAX-RS Application 类的 getClasses() 方法。TomEE 内置的 CXF/JAX-RS 集成具备 CDI 感知能力,若 Application 子类带 @ApplicationPath("/rest") 会自动发现。此步骤仅适用于 TomEE;若迁移到普通 Tomcat 则需保留该 Servlet,但端点类无法使用 CDI 注入。
Step 8:更新 beans.xml 到 Jakarta EE 命名空间。若项目 beans.xml 使用旧的 javax 命名空间,需更新为 Jakarta CDI 4.0,否则 TomEE 10 可能出现 CDI bean 发现问题。
适用场景与限制
适用于使用 EJB 且需要迁移到 Cloud Foundry 的 SAP BTP Neo Java 应用。必须先完成 Jakarta EE 10 迁移。需注意 persistence.xml 位置错误会导致 DDL 静默失败,HANA Cloud 大文本字段需改用 NCLOB,HANA schema 服务绑定不可省略。