我们有一个带有一些 ejb 和 war 模块的 Maven 多模块项目。其中一个模块用作整个平台的集成测试器。我们使用嵌入式 EjbContainer 成功测试了 ejb,包括安全性、依赖注入和事务。
现在我们想将 CDI 添加到混合中,这就是出现问题的时候。
问题
根据文档,为了激活 CDI,我们只需将一个空beans.xml添加到我们要激活它的 ejb 模块的META-INF文件夹中。就这么简单,完成后嵌入式服务器无法启动,因此我们无法运行任何集成测试。
抛出的异常是:
java.lang.RuntimeException: javax.ejb.EJBException: Failed to deploy EJB modules - see log for details
...
Caused by: javax.ejb.EJBException: Failed to deploy EJB modules - see log for details
stackTrace 的其余部分只是指向我们尝试启动服务器的那一行,并没有提供任何有用的信息。
有两点需要注意:
- 即使没有任何 @Injected bean,启动也会失败。
- CDI 在非嵌入式 glassfish 中运行时工作正常,所以我们的问题只在 testing 上。
我们的系统
Maven项目结构
myproject
myproject-ear
myproject-domain
myproject-ejb1
myproject-ejb2
myproject-war
myproject-test
环境
- Glassfish 3.1、3.2
- TestNG
File[] modules = {
new File("/target/classes"),
new File("../myproject-ejb1/target/classes"),
new File("../myproject-ejb2/target/classes")
...};
properties.put(EJBContainer.APP_NAME, "myproject");
properties.put(EJBContainer.MODULES, modules);
properties.put("org.glassfish.ejb.embedded.glassfish.instance.root","./src/main/resources");
EJBContainer container = EJBContainer.createEJBContainer(properties);
到目前为止我们发现了什么
我们在 glassfish 上启用了更精细的日志记录,但我们仍然不知道发生了什么故障。
我们知道 Arquillian,我们认为这是一种可能性,但我们想最后一次尝试使用标准 api。
知道我们做错了什么吗?