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



我遇到了将EntityManager从测试源中的Producer注入到主源中的服务的问题。其目的是将此库嵌入到另一个项目中,在该项目中,该项目将使用自己的PersistenceContext单元名称定义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
  • Surefire:2.4.2
  • 玻璃鱼嵌入所有: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");

我根本看不出问题^^

你有src/test/resources/META-INF/beans.xml?

你的测试看起来怎么样?Arquillian,还是手动启动容器?类路径中有带有MY_PU PersistenceUnit的persistence.xml吗?我可以在任何github左右的地方查看示例项目?

我需要更多关于你的环境的信息来帮助你。。。

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

这个问题似乎在本次Glassfish JIRA中进行了讨论。我似乎找不到讨论中提到的Maven JIRA。我仍在寻找一种方法来使用嵌入Glassfish的最新Maven,但运气不太好。

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

最新更新