Java 找不到元素持久性的声明-但XML已正确定义

Java 找不到元素持久性的声明-但XML已正确定义,java,xsd,persistence.xml,Java,Xsd,Persistence.xml,我在尝试将war部署到Tomcat 7服务器时遇到了这个问题: IllegalArgumentException:URL[jar:file:/opt/webapps/foo/WEB-INF/lib/bar.jar!/META-INF/persistence.XML]中的持久化单元中的XML无效 SAXParseException;cvc elt.1:找不到元素“persistence”的声明 我在这里读过无数类似的问题,但所有的问题都是由错误的名称空间、不匹配的版本、缺少元素造成的。。。据我所知

我在尝试将war部署到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文件是正确的:


com.foo.Bar
com.foo.Baz
事实上,同样的战争在我的电脑和我们的开发环境上都很好。当我们将它升级到测试环境时,它就失败了。我相信这可能是因为无法从该服务器访问xmlns.jcp.org,至少我在尝试卷曲XSD URL时没有得到任何回复,只是超时了。此外,Tomcat大约需要1分钟来显示错误消息,这也表明它正在尝试加载远程XSD并获得超时

在过去的5个小时里,我一直在尝试使用本地XSD文件,但到目前为止,我还没有成功。我试着把文件放在

  • 直接在WEB-INF/中
  • 在包含persistence.xml的jar中,位于同一文件夹(META-INF/)中
  • 在jar内部的WEB-INF/文件夹中
在persistence.xml中:


如果我删除schemaLocation,我所完成的唯一一件事就是避免了1分钟的等待时间。但问题依然存在。(没有双关语的意思…)

persistence.xml文件是从applicationContext.xml加载的,以防有任何不同:


...

我还可以尝试什么?

我忘了提到,我从这里下载了XSD文件(并将其重命名为persistence.XSD,以防万一)。并且它的targetNamespace与我声明的xmlns相同。当不同的环境包含不同的应用服务器、java版本等时,通常会出现此类问题。是否每个环境中都有相同的JDK和tomcat版本?是的,两个服务器中的JDK和tomcat版本应该相同,在我的电脑中可能不是这样。区别在于开发服务器由我们维护,没有传出流量限制,而测试服务器位于客户的数据中心,他们减少了对xmlns.jcp.org的请求。我没有时间解决这个问题,因此作为一种解决方法,我在同一个测试服务器上的另一个Tomcat中发布了XSD,并将完整的URL放在XMLSchemaLocation中。它正在工作。尽管如此,我还是希望能够在本地引用XSD文件……做得好。在这种情况下,只需将XSD放入apps webapps文件夹并更新链接即可。