Каков правильный путь для ссылки 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 не поддерживается всеми поставщиками.