【发布时间】:2012-04-11 03:51:00
【问题描述】:
我在将测试源中的 Producer 中的 EntityManager 注入主源中的服务时遇到问题。目的是将这个库嵌入到另一个项目中,该项目将使用它自己的PersistenceContext unitName 定义一个Producer。如果我在主要来源中没有 Producer,我会收到 Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MY_PU 错误。
例如:
/** src/main/java/org/sample/service */
@Stateless
public class MyBean {
@Inject
@MyCustomQualifier
private EntityManager em;
}
/** src/test/java/org/sample/service */
public class EntityManagerProducer {
@Produces
@MyCustomQualifier
@PersistenceContext(unitName = "MY_PU")
private EntityManager em;
}
为了让我测试服务,我必须使用 maven ant 插件将 *.class 文件移动到 target/classes 目录并在打包阶段之前将其删除。这有效,但它很笨拙。我尝试在surefire插件中更改<useSystemClassLoader>和<useManifestOnlyJar>参数,但没有成功。
还有其他方法吗?
我的环境
- Maven:2.2.1
- 万无一失:2.4.2
- glassfish-embedded-all: 3.1.1
编辑
beans.xml 存在于 (test/main)/resources/META-INF 中
我正在按如下方式启动 GF 容器。
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(EJBContainer.MODULES, new File[]{new File("target/classes"), new File("target/test-classes")});
EJBContainer ejbContainer = EJBContainer.createEJBContainer(properties);
Context ctx = ejbContainer.getContext();
MyBean service = ctx.lookup("java:global/ejb-app/classes/MyBean");
【问题讨论】:
-
听起来项目中的库和类与 glassfish 正在加载的内容冲突。我从来没有在嵌入式容器和 maven 方面获得过好运气,因为 maven 不会保持类路径的清洁。如果你在一个新的虚拟机中启动 glassfish 会发生什么?
-
@LightGuard:默认情况下,surefire forkMode 是
once。所以嵌入式容器应该在与 maven 不同的 JVM 中。 reference
标签: jpa maven classpath cdi surefire