无法打开META-INF / persistence.xml,因为它不存在 [英] META-INF/persistence.xml cannot be opened because it does not exist

查看:499
本文介绍了无法打开META-INF / persistence.xml,因为它不存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个基本的spring-maven项目,该项目应作为Java应用程序运行(正在运行,而不是通过Web服务器运行。)。

I'm creating a basic spring-maven project that should run as a java application (in process, not over a web server).

我的应用程序上下文位于在我的类路径中的资源文件夹下:

My application context resides under the resources folder which is in my classpath:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:ox="http://www.springframework.org/schema/oxm"
    xsi:schemaLocation="
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
   http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1xsd">


<!-- Root Context: defines shared resources visible to all other web components -->

<!-- Context -->
<context:component-scan base-package="me.co.nutrition" />

<!-- Properties -->
<context:property-placeholder
    location="classpath:/nutrition.accumulation.properties" />

<!-- DB -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<bean id="persistenceUnitManager"
    class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="defaultPersistenceUnitName" value="nutrition-pu"/>
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
    <property name="defaultDataSource" ref="dataSource" />
</bean>

<!-- JPA -->
<bean id="entityManager"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitManager" ref="persistenceUnitManager" />
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
</bean>

<!-- jpaVendorAdapter (works in conjunction with the persistence.xml) -->
<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="database" value="${jpa.database}" />
    <property name="showSql" value="${jpa.showSql}" />
    <property name="databasePlatform" value="${jpa.dialect}" />
    <property name="generateDdl" value="${jpa.generateDdl}" />
</bean>

<!-- Transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManager" />
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="persistenceAnnotation" class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

</beans>

我创建了一个META-INF文件夹作为源文件夹,并将此文件夹添加到我的类路径中。我在此文件夹下创建了persistence.xml文件。

I created a META-INF folder as a source folder and added this folder to my classpath. I created my persistence.xml file under this folder.

这是我的persistence.xml:

Here is my persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
    version="2.0">

<persistence-unit name="nutrition-pu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
</persistence-unit>
</persistence>

如上所述,它位于我的类路径中的META-INF文件夹下。这是我的.classpath文件:

And as mentioned, it is under META-INF folder which is in my classpath. Here is my .classpath file:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java"/>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
    <classpathentry kind="src" path="META-INF"/>
    <classpathentry kind="src" path="resources"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

您会看到META-INF文件夹在那里。
我创建了一个简单的main,运行:

you can see that the META-INF folder is there. I created a simple main that runs:

public static void main(String[] args) throws Exception {

            ApplicationContext context = new ClassPathXmlApplicationContext("accumulationApplicationContext.xml");

...
}

尝试加载应用程序上下文时,出现一个异常,指出无法找到或解析persistence.xml:

As I run this, when trying to load the application context I get an exception that says the persistence.xml cannot be found or parsed:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'persistenceUnitManager' defined in class path resource [accumulationApplicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Cannot parse persistence unit from class path resource [META-INF/persistence.xml]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
    ... 30 more
Caused by: java.lang.IllegalArgumentException: Cannot parse persistence unit from class path resource [META-INF/persistence.xml]
    at org.springframework.orm.jpa.persistenceunit.PersistenceUnitReader.readPersistenceUnitInfos(PersistenceUnitReader.java:141)
    at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.readPersistenceUnitInfos(DefaultPersistenceUnitManager.java:380)
    at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:341)
    at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:326)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    ... 37 more
Caused by: java.io.FileNotFoundException: class path resource [META-INF/persistence.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:158)
    at org.springframework.orm.jpa.persistenceunit.PersistenceUnitReader.readPersistenceUnitInfos(PersistenceUnitReader.java:129)

我不明白问题所在。我很确定我具有正确的结构,为什么我的persistence.xml无法加载?

I can't understand the problem. I'm quite sure i have the right structure, why can't my persistence.xml load?

谢谢!

更新:

感谢 Boris ,我可以正常使用了。看来我在错误的路径下创建了META-INF。发生这种情况是因为我想念不懂Eclipse项目结构。 是正确的结构。我希望这对某人有所帮助。

Thanks to Boris I got it working. It a seems that I created the META-INF under the wrong path. This happened since I miss understood something with Eclipse project structure. This is the right structure. I hope this helps someone..

推荐答案

您的META-INF文件夹应直接位于源代码的之下。文件夹,而不是单独作为源文件夹。

Your META-INF folder should be directly under the source folder, not to be the source folder by itself.

请参见我应该在哪里将META-INF放在Eclipse中?

update 来自JPA 2.0规范


8.2< ...>持久性单元由persistence.xml文件定义。其
META-INF目录包含persistence.xml文件的jar文件或目录称为持久性单元的根。
在Java EE环境中,持久性单元的根必须为以下之一:

8.2 <...> A persistence unit is defined by a persistence.xml file. The jar file or directory whose META-INF directory contains the persistence.xml file is termed the root of the persistence unit. In Java EE environments, the root of a persistence unit must be one of the following:


  • EJB-JAR文件

  • WAR文件的WEB-INF / classes目录

  • WAR文件的WEB-INF / lib目录中的jar文件

  • EAR库目录中的jar文件

  • 应用程序客户端jar文件

  • an EJB-JAR file
  • the WEB-INF/classes directory of a WAR file
  • a jar file in the WEB-INF/lib directory of a WAR file
  • a jar file in the EAR library directory
  • an application client jar file


8.2.1< ...> persistence.xml文件定义一个持久性单元。 persistence.xml文件位于持久性单元根目录的
META-INF 目录中。

因此,配置项目的方式没有什么不同,只有最终的jar很重要。如果您使用的是Maven,通常的做法是将 src / main / resources 文件夹用于META-INF。

So it makes no difference how you configure your project, it's only the resulting jar that matters. If you're using maven, a common practice is to use src/main/resources folder for META-INF.

这篇关于无法打开META-INF / persistence.xml,因为它不存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆