使用maven和嵌入式glassfish的CDI类路径问题

时间:2012-03-27 15:21:12

标签: jpa maven classpath cdi surefire

我遇到了从测试源中的EntityManager向主源中的服务注入Producer的问题。目的是将此库嵌入到另一个项目中,项目将使用它自己的Producer unitName定义PersistenceContext。如果我在主要来源中没有制作人,则会出现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
  • Surefire: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");

3 个答案:

答案 0 :(得分:0)

嗯,我根本没有看到问题^^

你有吗? 的src /测试/资源/ META-INF / beans.xml文件?

您的测试结果如何? Arquillian,还是手动启动容器? 你是否在类路径中使用带有MY_PU PersistenceUnit的persistence.xml?我可以查看示例项目的任何github吗?

我需要更多关于您的环境的信息来帮助您...

答案 1 :(得分:0)

我们遇到了类似的问题,并降级为Maven 3.0.5。

问题似乎在this Glassfish JIRA中讨论过了。我似乎无法找到讨论中提到的Maven JIRA。我仍然在寻找一种方法来使用嵌入式Glassfish的最新Maven,但运气不佳。

答案 2 :(得分:0)

E!我忘记了这篇文章。感谢所有提供意见的人。 IIRC,我们最终放弃了使用Arquillian的嵌入式容器,转而使用外部GF容器。当时,我认为我们觉得它提供了一个更现实的测试环境,并且避免了嵌入式容器的类加载问题。