URL http://www.csail.mit.edu/~lkagal/foaf
фактически перенаправляет на http://people.csail.mit.edu/lkagal/foaf
. Наличие редиректа - причина ошибки.
Об этой проблеме уже сообщалось и она исправлена в ветке разработки Jena
(ошибка [JENA-1263]).
Анализ
Apache Jena использует Apache HttpClient для обработки соединения. В частности, Jena 3.1.0
использует HttpClient 4.2.6
, который был обновлен до HttpClient 4.5.2
в Jena 3.1.1
.
Как указано в @potame, проблема не возникает при использовании Jena 3.1.0
, причина заключается в том, что он создает соединение, которое по умолчанию поддерживает различные функции, в том числе автоматические следующие перенаправления (он использует new SystemDefaultHttpClient()
).
Напротив, с обновлением HttpClient
в Jena 3.1.1
код был изменен для создания более минимального типа соединения, которое не может следовать перенаправлениям (он использует HttpClients.createMinimal()
).
Что происходит, так это то, что вместо того, чтобы добраться до вашего foaf
файла, он просто получает сообщение о перенаправлении, которое:
name="[xml]",ch=DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://people.csail.mit.edu/lkagal/foaf">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at www.csail.mit.edu Port 80</address>
</body></html>
а затем пытается проанализировать его с помощью Apache Xerces, который на самом деле вызывает исключение (вы можете видеть, что используя ex.printStackTrace()
вместо System.out.println(ex.toString())
):
...
at org.apache.xerces.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:282)
at org.apache.xerces.impl.XMLScanner.reportFatalError(XMLScanner.java:1467)
at org.apache.xerces.impl.XMLScanner.scanExternalID(XMLScanner.java:1001)
...
Решения
- используйте прямой URL,
http://people.csail.mit.edu/lkagal/foaf
- используйте предыдущую версию
Jena
- используйте ветку разработки
Jena
предоставьте Jena
ваше собственное соединение с возможностью перенаправления, которое будет использоваться вместо соединения по умолчанию; вы можете сделать это, вызвав метод HttpOp.setDefaultHttpClient
перед использованием model.read
, например:
HttpOp.setDefaultHttpClient(HttpClientBuilder.create().build());
person
Loris Securo
schedule
24.12.2016