org.xml.sax.SAXParseExceptionpublicId:http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd

时间:2019-06-23 23:46:45

标签: xml jpa persistence.xml

执行时突然抛出错误:

org.xml.sax.SAXParseExceptionpublicId: 
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd; lineNumber: 
1; columnNumber: 1; Deployment descriptor file META-INF/persistence.xml 
in archive [classes].  Premature end of file.



curl -v http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd
*   Trying 2600:1402:f000:392::f6b...
* TCP_NODELAY set
* Connected to xmlns.jcp.org (2600:1402:f000:392::f6b) port 80 (#0)
> GET /xml/ns/persistence/persistence_2_1.xsd HTTP/1.1
> Host: xmlns.jcp.org
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: AkamaiGHost
< Content-Length: 0
< Location: https://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd
< Cache-Control: max-age=0
< Expires: Sun, 23 Jun 2019 23:21:20 GMT
< Date: Sun, 23 Jun 2019 23:21:20 GMT
< Connection: keep-alive
<
 * Connection #0 to host xmlns.jcp.org left intact

直到今天这一直不是问题,并且似乎该文件不再可用,但是它是JPA持久性xml文件的标准参考:

HTTP/1.1 301 Moved Permanently

其他任何人突然都有这个问题吗?我无法跟踪到任何更改,并且在本地和服务器上都遇到了这种情况。

5 个答案:

答案 0 :(得分:1)

问题的根源似乎在于Oracle和对安全性的关注,促使最近切换到HTTPS协议。
org.apache.openjpa.lib.meta中的XMLMetaDataParser使用SaxParser读取parseNewResource方法中的xml文件,这会导致文件错误提前结束。错误文本不是特别有用。但是,借助XML复制编辑器 [ http://xml-copy-editor.sourceforge.net]来验证架构会发现实际涉及的错误:
第0行第0列的致命错误:URL中不支持的协议。这些信息最终使我转到了一篇涉及OpenEdge的帖子,日期为2018年11月6日: [ https://knowledgebase.progress.com/articles/Article/Unsupported-protocol-in-URL-reading-XML-from-a-URI]
在“原因”下,它指出:“以前用于HTTP的URL现在正在重定向到HTTPS。”
在解决方案下,“这是OpenEdge客户端内部使用的Apache Xerces解析器中的一个限制。它仅具有有限的URL支持,因此解析器无法处理URL重定向或类似于Web浏览器的HTTPS URL。” < br /> 因此,在错误消息中标识为“ systemId”的xml文本的重要部分是http协议语句,该语句现在在Oracle网站上重定向到https,从而导致解析错误。这解释了为什么一天运行良好的代码在第二天早晨突然停止工作。应该很快就知道有多少ORM实现有此限制。

问题解决了。我替换了
https://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd

https://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd
并且程序现在可以正常构建。

答案 1 :(得分:0)

自今天以来,我遇到了同样的问题。我的快速解决方案是将persistance.xml版本从2.1更改为1.0,这对我有用。

答案 2 :(得分:0)

快速修复方法是使URL http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd仅返回404,而不会重定向到https。就像将127.0.0.1 xmlns.jcp.org添加到/ etc / hosts中一样。

答案 3 :(得分:0)

我通过将http更改为https来解决,因此不会发生重定向(这是问题所在)。

<? xml version = "1.0" encoding = "UTF-8"?>
<persistence version = "2.1"
xmlns = "https://xmlns.jcp.org/xml/ns/persistence" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi: schemaLocation = "https://xmlns.jcp.org/xml/ns/persistence https://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

注意:我在Java 7和glassfish 3上遇到了这个问题,在Java 8和glassfish 4上却起作用了。

答案 4 :(得分:0)

现在的解决方法是使用架构位置修改persistence.xml:

http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd

persistence.xml的第一行如下:

<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://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd" version="2.1">

更多详细信息和原因: 此问题的根本原因是由于从http到https的多次重定向,反之亦然。 我使用curl到达了最终网址:

curl -v  http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd

HTTP / 1.1 301永久移动 位置:https://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd

curl -v https://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd

HTTP / 1.1 301永久移动 http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd

在所有persistence.xml中使用它。 这对我有用。

注意: Oracle可能会再次更改此最终URL。如果他们完全更改了URL,并且您的构建失败,您将知道如何使用curl命令获取最终URL。

谢谢