当我尝试将战争部署到Tomcat 7服务器时遇到此问题:
IllegalArgumentException:来自URL [jar:file:/opt/webapps/foo/WEB-INF/lib/bar.jar!/META-INF/persistence.xml]的持久性单元中的XML无效
SAXParseException; cvc-elt.1:找不到元素“ persistence”的声明。
我在这里阅读了无数类似的问题,但是所有问题都是由错误的名称空间,版本不匹配,元素丢失...引起的,我的persistence.xml文件是正确的告诉:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="my_pu" transaction-type="RESOURCE_LOCAL">
<class>com.foo.Bar</class>
<class>com.foo.Baz</class>
</persistence-unit>
</persistence>
实际上,同样的战争在我的PC和我们的开发环境上也能正常工作。当我们将其推广到我们的测试环境时,它只是失败了。我相信这可能是由于xmlns.jcp.org无法从该服务器访问,至少当我尝试卷曲XSD URL时,我没有得到任何回复,只是超时。另外,Tomcat大约需要1分钟才能显示错误消息,这也表明它正在尝试加载远程XSD并超时。
我花了最后5个小时来尝试改用本地XSD文件,但到目前为止,我还没有成功。我试过放置文件...
在persistence.xml中:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
version="2.1">
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence persistence.xsd"
version="2.1">
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence ./persistence.xsd"
version="2.1">
<persistence>
<persistence version="2.1">
如果删除schemaLocation,我唯一要做的就是避免等待1分钟。但是问题仍然存在。 (无双关语...)
如果有任何不同,则从applicationContext.xml加载persistence.xml文件:
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory">
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
...
</bean>
我还能尝试什么?