【问题标题】:CDI classpath issue using maven and embedded glassfish使用 Maven 和嵌入式 glassfish 的 CDI 类路径问题
【发布时间】: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


【解决方案1】:

嗯,我完全没有看到问题^^

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

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

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

【讨论】:

  • 我没有使用 Arquillian。简单的EJBContainer.createEJBContainer()(注意上面的编辑)。是的,persistence.xml 存在于类路径中。对不起,没有github。
  • Troy,你能试试 Persistence.createEntityManagerFactory("MY_PU").createEntityManager() 吗?如果这可行,那么我们可以尝试进一步的步骤。如果这已经给您一个无效的 EM 或根本没有,那么您的 JPA 安装或您的 persistence.xml 有问题。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多