2010-12-13 14 views
19

persistence.xml se ve así:¿Cuál es la ruta correcta para referir un archivo jar a jpa persistence.xml en una aplicación web?

<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> 

Es un proyecto web, por lo que la unidad de despliegue es un archivo de la guerra. el archivo JAR Traté de hacer referencia está en carpeta WEB-INF//lib, persistence.xml es en WEB-INF/classes/carpeta META-INF. Al implementarlo, simplemente me dice

"ADVERTENCIA: no se puede encontrar el archivo (ignorado): file: .../../lib/app-services-1.0.jar".

También probé todos los caminos posibles que podía pensar, es decir, ../lib/app-services-1.0.jar, lib/app-servicios-1.0.jar.

¿Cuál es el camino correcto para hacer esto?

+0

¿En qué servidor está ejecutando su aplicación? JBoss? GlassFish? Si se trata de JBoss, no debería necesitar especificar Hibernate en absoluto; es el predeterminado. –

+1

GlassFish, Matt. Mi problema no es Hibernate o no, se trata de cómo decirle al proveedor de JPA la ruta al archivo jar para poder escanear automáticamente las entidades. – Bobo

Respuesta

12

en caso de que alguien más tropiece con esto: la declaración jar-file es solo válida. cuando la unidad de persistencia se despliega como parte de un Archivo de empresa (.ear) - en cualquier otro caso (.war), persistence.xml debe residir en/META-INF/y no puede refrenciar clases que viven fuera de la unidad de persistencia (ver: http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html). Entonces, hasta donde yo sé, no hay forma de tener un persistence.xml que viva en WEB-INF/classes/META-INF que haga referencia a clases que no vivan en WEB-INF/classes.

+1

Pensé que, al igual que los archivos ear, esto también es posible para los archivos de guerra, pero después de intentar mucho, vi tu publicación aquí y entiendo que no es posible para los archivos war. pero lo interesante es que cuando especifico la 'ruta absoluta' de archivos jar en el sistema de archivos, ¡funciona! ;) – Heidarzadeh

+2

Tu respuesta es completamente incorrecta. Las clases de entidad no deben estar dentro del archivo JAR que actúa como raíz de persistencia. De ningún modo. Sé con certeza que en Weblogic, Glassfish y TomcatEE, un archivo WAR puede contener perfectamente un archivo JAR interno que contiene META-INF/persistence.xml y se refiere de manera bastante trivial a otros archivos jar en la misma carpeta lib utilizando el jarrón - elemento de archivo con el nombre de los otros tarros. Puede ver también en la página 367 y 368 de JPA 2.1 JSR que este es el caso. Dicho esto, hacer que esto funcione en Wildfly 10 está demostrando ser un desafío. – 99Sono

+0

Descargue el JSR desde aquí: http://download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/index.html – 99Sono

0

No estoy seguro de que esto esté relacionado con el hecho de que está implementando como WAR, pero la ruta debería ser simplemente "app-sevices-1.0.jar" y el jar debería estar en la lib de la aplicación Java EE. Lo que pasa es que no estoy seguro de si esto está disponible para la aplicación Java EE simplificada de "guerra". Sospecho que esto está disponible solo para el archivo de implementación Java EE tradicional (ear). Probaría hacer un EAR, conteniendo un WAR para la aplicación web, JAR para la PU y su otra JAR para servicios de aplicaciones, como lo sería una implementación Java EE tradicional.

Otra cosa a tener en cuenta es que las rutas relativas no son compatibles, y el uso de esto en el entorno SE no es compatible con todos los proveedores.

+0

Intentó la ruta simple "app-services-1.0.jar" y como sospechaba, no funciona. ¿Entonces supongo que la pregunta es para los archivos war, que simplemente no se puede usar? – Bobo

15

¡Echar un vistazo a jsr siempre funciona!

8.2.1.6.3 Jar Archivos

Uno o más archivos JAR pueden ser especificados usando los jar-file elementos en lugar de, o además de los archivos de asignación especificados en las mapping-file elementos. Si se especifica, estos archivos JAR se buscarán para clases de persistencia administradas, y cualquier anotación de metadatos de mapeo encontrada en ellos se procesará, o se mapearán usando los valores predeterminados de la anotación de mapeo definidos por esta especificación. Dichos archivos JAR se especifican en relación con el directorio o el archivo jar que contiene la raíz de la unidad de persistencia.

Los siguientes ejemplos ilustran el uso del elemento jar-file para hacer referencia a clases de persistencia adicionales. Estos ejemplos utilizan la convención de que un archivo jar con un nombre que termina en "PUnit" contiene el archivo persistence.xml y que un archivo jar con un nombre que termina en "Entidades" contiene clases de persistencia adicionales.

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> 

Como se puede ver no hay ningún ejemplo para los archivos de guerra, todos los archivos de guerra en los ejemplos anteriores son archivos de oído en el interior!
Pero probé en archivos war y funciona justo cuando especifico la ruta absoluta de los archivos jar y no es un buen enfoque para el entorno de producción.

+0

Esta es la mejor respuesta porque da ejemplos de qué poner para el elemento jar-file. Verificado para trabajar también. –

+0

@Heidarzadeh ¿cómo se puede inyectar ahora un EntityManager que hace referencia al nombre de la unidad de persistencia dentro de earLibPUnit.jar, ninguno de los ejemplos muestra que – Francis

7
war2.war 
     WEB-INF/lib/warEntities.jar 
     WEB-INF/classes/META-INF/persistence.xml 
persistence.xml contains: 
    <jar-file>lib/warEntities.jar</jar-file> 

este formato funciona para el archivo war. Estoy usando Wildlfy 8.2.0 y JPA 2.1

+1

también funciona con Payara Server 4.1.1.162 #badassfish (compilación 116) –

+0

funciona en websphere 8.5.5 – Martin

Cuestiones relacionadas