Maven Webapp找不到持久性单元。没有名为'的持久化单元;X';在范围内可用

Maven Webapp找不到持久性单元。没有名为'的持久化单元;X';在范围内可用,maven,jpa,ejb,jpa-2.0,persistence.xml,Maven,Jpa,Ejb,Jpa 2.0,Persistence.xml,我正在尝试使用EJB3.1、JPA2.0、M2E-WTP和JSF2.1技术在weblogic 12c服务器上运行我的webapp,并继续出现以下错误: javax.ejb.EJBException: EJB Exception: : java.lang.IllegalArgumentException: No persistence unit named 'X' is available in scope Webapp. Available persistence units: [] at we

我正在尝试使用EJB3.1、JPA2.0、M2E-WTP和JSF2.1技术在weblogic 12c服务器上运行我的webapp,并继续出现以下错误:

javax.ejb.EJBException: EJB
Exception: : java.lang.IllegalArgumentException: No persistence unit named 'X'
is available in scope Webapp. Available persistence units: [] at
weblogic.persistence.ModulePersistenceUnitRegistry
.getPersistenceUnit(ModulePersistenceUnitRegistry.java:130) at
weblogic.persistence.BasePersistenceContextProxyImpl
.<init>(BasePersistenceContextProxyImpl.java:40) at
weblogic.persistence.TransactionalEntityManagerProxyImpl
.<init>(TransactionalEntityManagerProxyImpl.java:31) at
weblogic.persistence.EntityManagerInvocationHandlerFactory.
createTransactionalEntityManagerInvocationHandler
(EntityManagerInvocationHandlerFactory.java:20) at 
weblogic.persistence.PersistenceManagerObjectFactory
.createPersistenceContextProxy(PersistenceManagerObjectFactory.java:66) at 
weblogic.persistence.PersistenceManagerObjectFactory
.getObjectInstance(PersistenceManagerObjectFactory.java:31) at 
javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
at weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:251) at
weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:406) at
weblogic.j2eeclient.java.ClientReadOnlyContextWrapper.lookup
javax.ejb.EJBException:ejb
异常::java.lang.IllegalArgumentException:没有名为“X”的持久化单元
在scope Webapp中提供。可用的持久性单元:[]位于
weblogic.persistence.ModulePersistenceUnitRegistry
.getPersistenceUnit(ModulePersistenceUnitRegistry.java:130)位于
weblogic.persistence.BasePersistenceContextProxyImpl
(BasePersistenceContextProxyImpl.java:40)位于
weblogic.persistence.TransactionalEntityManagerProxyImpl
(TransactionalEntityManagerProxyImpl.java:31)位于
weblogic.persistence.EntityManager职业HandlerFactory。
CreateTransactionalEntityManager职业处理程序
(EntityManager职业HandlerFactory.java:20)位于
weblogic.persistence.PersistenceManagerObjectFactory
.createPersistenceContextProxy(PersistenceManagerObjectFactory.java:66)位于
weblogic.persistence.PersistenceManagerObjectFactory
.getObjectInstance(PersistenceManagerObjectFactory.java:31)位于
javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
在weblogic.jndi.internal.WLEventContextImpl.lookup(WLEventContextImpl.java:251)中
weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:406)位于
weblogic.j2eeclient.java.clientradonlyContextWrapper.lookup
这是触发异常的EJBBean

@Stateless
public class QuoteSessionEJB implements QuoteSessionEJBLocal {

/**
 * Default constructor. 
 */
public QuoteSessionEJB() {
    // TODO Auto-generated constructor stub
}

@PersistenceContext(unitName="X")
private EntityManager em;
/**
* Returns a list of Quote objects in the database
* @return List<Customer>
*/
public List<Quote> getQuote() {
Query query = em.createNamedQuery("findQuotes");
return query.getResultList();
}

}
@无状态
公共类QuoteSessionEJB实现QuoteSessionEJBLocal{
/**
*默认构造函数。
*/
公共QuoteSessionEJB(){
//TODO自动生成的构造函数存根
}
@PersistenceContext(unitName=“X”)
私人实体管理者;
/**
*返回数据库中Quote对象的列表
*@返回列表
*/
公共列表getQuote(){
Query Query=em.createNamedQuery(“findQuotes”);
返回query.getResultList();
}
}
下面是persistence.xml文件,它位于eclipse构建的src/main/java-->META-INF下

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="X" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>localJTA</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="eclipselink.target-server" value="WebLogic"/>
        <property name="eclipselink.logging.level" value="FINEST"/>          
    </properties>
</persistence-unit>
</persistence>

org.eclipse.persistence.jpa.PersistenceProvider
本地jta
假的
我花了几个小时在网上搜索答案,但毫无结果。我不明白为什么在persistence.xml中找不到持久性单元X

我希望有人遇到过同样的问题,或者知道如何解决它。 非常感谢您的帮助

更新:根据下面的better\u use\u mkstemp注释,我将包含persistence.xml的META-INF文件夹从src/main/java移动到WEB-INF/classes。我必须在eclipse中创建classes文件夹。这成功了!非常感谢

接下来的问题:做了更多的研究,我发现将META-INF文件夹放在src/main/resources中也能解决问题,但事实并非如此。我不知道这是否是Maven的M2E-WTP eclipse插件的问题,或者我只是误解了一些东西。下面是文件夹结构的屏幕截图


通过浏览maven install命令创建的war文件,我可以看到META-INF文件夹正确地放置在WEB-INF/classes文件夹中。但是简单地在Eclipse中发布到服务器是不起作用的。除非我手动在WEB-INF下创建classes文件夹,并手动将META-INF文件夹放到/移动到其中,否则我无法让它在IDE中工作。另外,将META-INF文件夹的副本放在两个位置作为解决方案似乎没有意义。

尝试在persistence.xml中替换:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

用于:


听起来您在ear/war中验证了persistence.xml是否在WEB-INF/classes/META-INF中?
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">