Эта проблема возникает при попытке развернуть войну на сервере Tomcat 7:
IllegalArgumentException: неверный XML в единицах персистентности из URL [jar: file: /opt/webapps/foo/WEB-INF/lib/bar.jar! /META-INF/persistence.xml]
SAXParseException; cvc-elt.1: не удается найти объявление элемента «постоянство».
Я прочитал бесчисленное подобных вопросов здесь, но все проблемы были вызваны неправильными пространствами имен, несовпадающими версиями, отсутствующими элементами ... Мой файл 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>
На самом деле, та же самая война прекрасно работает на моем ПК и в нашей среде разработки. Это просто терпит неудачу, когда мы продвигаем это в нашу среду тестирования. Я полагаю, что это может быть связано с тем, что xmlns.jcp.org недоступен с этого сервера, по крайней мере, я не получаю никакого ответа при попытке свернуть URL-адрес XSD, это просто тайм-аут. Кроме того, Tomcat требуется около 1 минуты, чтобы отобразить сообщение об ошибке, что также дает представление о том, что он пытается загрузить удаленный XSD и получает тайм-аут.
Последние 5 часов я пытался заставить его взять локальный XSD-файл, но пока мне это не удалось. Я пытался разместить файл ...
- Прямо в WEB-INF /.
- Внутри банки, в которой находится файл persistence.xml, в той же папке (META-INF /).
- Внутри банки, в папке WEB-INF /.
А в файле 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">
Единственное, чего я добился - это избежал 1-минутного ожидания, если я удалю schemaLocation. Но проблема сохраняется. (без каламбура ...)
Файл persistence.xml загружается из applicationContext.xml на случай, если что-то изменится:
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory">
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
...
</bean>
Что еще можно попробовать?