2012-03-27 63 views
1

我在将测试源中的Producer注入EntityManager到主源中的服务时遇到问题。目的是将该库嵌入到另一个项目中,在该项目中,项目将使用它自己的PersistenceContext unitName定义Producer。如果我在主要来源中没有生产者,我会得到Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MY_PU错误。使用maven和嵌入式玻璃鱼的CDI类路径问题

例如:

/** 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蚂蚁插件的* .class文件移动到target/classes目录和包装阶段之前将其删除。这工作,但它是kludgy。我试过在surefire插件中更改<useSystemClassLoader><useManifestOnlyJar>参数,但没有成功。

还有别的办法吗?

我的环境

  • 的Maven:2.2.1
  • 神火:2.4.2
  • GlassFish的嵌入式全: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"); 
+0

听起来像项目中的库和类与glassfish加载的内容相冲突。我从来没有对嵌入式容器和maven好运,因为maven不能保持classpath的清洁。如果你在一个新的vm中启动glassfish会发生什么? – LightGuard 2012-03-27 16:52:25

+0

@LightGuard:默认情况下,surefire forkMode是'once'。所以嵌入式容器应该与maven分开的JVM。 (参考)(http://stackoverflow.com/questions/6813373/how-to-tell-maven2-to-execute-junit-tests-one-by-one-each-in-new-jvm-instance) – Hoon 2012-03-27 18:31:35

回答

0

好吧,我不看这个问题在所有的^^

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

你的测试是怎样的? Arquillian,还是你手动启动容器? 您是否在类路径中使用了MY_PU PersistenceUnit的persistence.xml?任何GitHub或那么我可以看看示例项目?

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

+0

我我没有使用Arquillian。简单的'EJBContainer.createEJBContainer()'(注意上面的编辑)。是的,persistence.xml存在于类路径中。对不起,没有github。 – Hoon 2012-03-29 20:37:45

+0

特洛伊,你可以试试 Persistence.createEntityManagerFactory(“MY_PU”)。createEntityManager()? 如果这项工作,那么我们可以尝试进一步的步骤。 如果这已经给你一个无效的EM或根本没有,那么你的JPA安装或persistence.xml有问题。 – struberg 2012-04-13 16:34:34

0

我们有一个类似的问题,降级到Maven 3.0.5。

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