0

我们有一个带有一些 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。

知道我们做错了什么吗?

4

1 回答 1

0

上次我手动使用嵌入式 glassfish 时,我设置的是org.glassfish.ejb.embedded.glassfish.installation.root属性而不是instance. 尝试这个。

附带说明:我强烈建议您尝试 Arquillian,因为它在选择目标容器时为您提供了灵活性,因为您的测试是可移植的。而且您不再需要摆弄这个笨拙的引导代码。此外,我不是嵌入式容器的忠实粉丝,因为它们经常让类加载器头疼。

于 2013-06-24T11:45:59.337 回答