环境
- WebLogic 11g(随后是 Java EE 5 和 EJB 3.0)
- 一个 EJB 包含的 JAR 也包含所有持久性实体。它工作得很好(有一个使用 EJB 的 Web 应用程序,它按预期工作)。我决定将实体分离到另一层,为此我创建了另一个模块并将其部署为可选包。所以现在我有两个 JAR 文件,顺便说一下,我分别部署而不是作为一个应用程序的一部分;持久性 JAR 和 EJB JAR。
问题
在部署 EJB 期间,我收到以下错误(告诉我未找到可选包):
无法部署 EJB:来自 BLayer-1.0.0-SNAPSHOT.jar 的 StocksBean:在 BLayer-1.0.0-SNAPSHOT.jar 范围内没有名为“internalAppsPU”的持久性单元可用
。可用的持久性单位:[]
更多信息
持久性模块的 JAR 清单
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: bm03043
Build-Jdk: 1.6.0_18
Extension-Name: com.amir.persistence
Implementation-Version: 1.0.0
Specification-Version: 1.6
持久性模块 JAR 的 META-INF 文件夹中的 persistence.XML
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="internalAppsPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>InternalAppsDS</jta-data-source>
<class>com.xx.persistence.Stock</class>
<properties>
<property name="eclipselink.logging.level" value="FINE" />
</properties>
</persistence-unit>
</persistence>
EJB的代码
package com.xx.bll;
// bunch of imports //
@Stateless(name="StocksBean", mappedName="Internal-BLayer-StocksBean")
public class StocksBean implements Stocks {
@PersistenceContext(unitName = "internalAppsPU")
private EntityManager em;
// SNIP //
}
EJB 的 JAR 清单
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: bm03043
Build-Jdk: 1.6.0_18
Extension-List: PLayer
PLayer-Extension-Name: PersistenceLayer
PLayer-Implementation-Version: 1.0.0-SNAPSHOT
PLayer-Specification-Version: 1.6
请注意以下事项:
- InternalAppsDS数据源之前在 WebLogic 中进行了配置。
- 在某些时候,我的印象是Extension-List中的名称必须与部署为可选包的 JAR 文件的名称相匹配。但是当我阅读更多时,我意识到这是不正确的。