Каков правильный путь для ссылки jar файла в jpa persistence.xml в веб-приложении?
persistence.xml выглядит следующим образом:
<persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>jdbc/test</non-jta-data-source>
<jar-file>../../lib/app-services-1.0.jar</jar-file>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
Это веб-проект, поэтому блок развертывания является военным файлом.
Файл jar, который я пытался найти, находится в папке WEB-INF/lib/, persistence.xml находится в папке WEB-INF/classes/META-INF. При развертывании он просто сообщает мне
"ПРЕДУПРЕЖДЕНИЕ: невозможно найти файл (игнорируется): файл:.../../lib/app-services-1.0.jar".
Я также пробовал все возможные пути, о которых я мог думать, т.е. ../lib/app-services-1.0.jar, lib/app-services-1.0.jar.
Каков правильный путь для этого?
Ответы
Ответ 1
на всякий случай, если кто-то еще наткнется на это: утверждение jar-file-only действителен. когда единица персистентности развертывается как часть Enterprise Archives (.ear) - в любом другом случае (.war), persistence.xml должен находиться в/META-INF/и не может ссылаться на классы, которые живут за пределами единицы персистентности (см. http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html). Итак, насколько я знаю, нет способа сохранить persistence.xml в WEB-INF/classes/META-INF, который ссылается на классы, которые не живут в WEB-INF/классах.
Ответ 2
Взгляд на jsr всегда работает!
8.2.1.6.3 Файлы Jar
Один или несколько файлов JAR могут быть указаны с помощью элементов jar-file
вместо или в дополнение к файлам сопоставления, указанным в элементах mapping-file
. Если указано, эти файлы JAR будут выполняться для поиска управляемых классов персистентности, а любые найденные на них аннотации метаданных сопоставления будут просканированы или будут отображены с использованием значений аннотации сопоставления, определенных этой спецификацией. Такие JAR файлы указываются относительно файла каталога или jar, который содержит корень модуля persis-tence.
Следующие примеры иллюстрируют использование элемента jar-file
для ссылки на дополнительные классы персистентности. В этих примерах используется соглашение о том, что файл jar с именем, заканчивающимся в "PUnit", содержит файл persistence.xml
и что файл jar с именем, заканчивающимся в "Entities", содержит дополнительные классы персистентности.
Example 1:
app.ear
lib/earEntities.jar
earRootPUnit.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>lib/earEntities.jar</jar-file>
Example 2:
app.ear
lib/earEntities.jar
lib/earLibPUnit.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>earEntities.jar</jar-file>
Example 3:
app.ear
lib/earEntities.jar
ejbjar.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>lib/earEntities.jar</jar-file>
Example 4:
app.ear
war1.war
WEB-INF/lib/warEntities.jar
WEB-INF/lib/warPUnit.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>warEntities.jar</jar-file>
Example 5:
app.ear
war2.war
WEB-INF/lib/warEntities.jar
WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
<jar-file>lib/warEntities.jar</jar-file>
Example 6:
app.ear
lib/earEntities.jar
war2.war
WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
<jar-file>../../lib/earEntities.jar</jar-file>
Example 7:
app.ear
lib/earEntities.jar
war1.war
WEB-INF/lib/warPUnit.jar (with META-INF/persistence.xml )
persistence.xml contains:
<jar-file>../../../lib/earEntities.jar</jar-file>
Как вы видите, нет примера для военных файлов, все военные файлы в приведенных выше примерах находятся внутри файлов уха!
Но я тестировал в военных файлах, и он работает, когда я указываю абсолютный путь к файлам jar, и это не очень хороший подход для производственной среды!
Ответ 3
war2.war
WEB-INF/lib/warEntities.jar
WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
<jar-file>lib/warEntities.jar</jar-file>
этот формат работает для файла войны. Im использует Wildlfy 8.2.0 и JPA 2.1
Ответ 4
Не уверен, что это связано с тем, что вы развертываете как WAR, но путь должен быть просто "app-sevices-1.0.jar", а банка должна находиться в lib приложения Java EE. Дело в том, что я не уверен, что это доступно для упрощенного "военного" Java EE-приложения. Я подозреваю, что это доступно только для обычного файла развертывания Java EE (уха). Я бы тестировал создание EAR, содержащего WAR для webapp, JAR для PU и другого JAR для приложений-сервисов, например, традиционное развертывание Java EE.
Еще одно замечание: относительные пути не поддерживаются, а использование этого в среде SE не поддерживается всеми поставщиками.