2010-12-13 1 views
19

persistence.xml sieht wie folgt aus:Was ist der richtige Weg, um eine JAR-Datei in jpa persistence.xml in einer Web-App zu verweisen?

<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 ist ein Web-Projekt ist, so dass der Einsatz-Einheit ist ein Krieg-Datei. Die JAR-Datei verweise ich versucht, ist in WEB-INF/lib/ Ordner persistence.xml ist in WEB-INF/classes/META-INF Ordner. Bei der Bereitstellung sagt es einfach

"Warnung: Kann Datei nicht finden (ignoriert): file: .../../lib/app-services-1.0.jar".

Ich habe auch versucht, jeden möglichen Weg, den ich denken konnte, das heißt ../lib/app-services-1.0.jar, lib/app-services-1.0.jar.

Was ist der richtige Weg, dies zu tun?

+0

Auf welchem ​​Server betreiben Sie Ihre App? JBoss? Glasfische? Wenn es sich um JBoss handelt, sollten Sie den Ruhezustand überhaupt nicht angeben müssen. Es ist die Standardeinstellung. –

+1

GlassFish, Matt. Mein Problem ist nicht über Hibernate oder nicht, es geht darum, JPA-Provider den Pfad zu der JAR-Datei mitzuteilen, um Entitäten automatisch zu scannen. – Bobo

Antwort

12

nur für den Fall, dass jemand anderes darauf stolpert: Die JAR-Datei-Anweisung ist nur gültig. Wenn die Persistenzeinheit als Teil eines Enterprise-Archivs (.ear) bereitgestellt wird - in jedem anderen Fall (.war) muss sich die Datei persistence.xml in/META-INF/befinden und Klassen, die sich außerhalb der Persistenzeinheit befinden, nicht referenzieren (siehe: http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html). Soweit ich weiß, gibt es keine Möglichkeit, eine persistence.xml in WEB-INF/classes/META-INF zu haben, die auf Klassen verweist, die nicht in WEB-INF/Klassen leben.

+1

Ich dachte, dass es wie bei Ear-Dateien auch für Kriegsdateien möglich ist, aber nachdem ich viel versucht habe, habe ich deinen Beitrag hier gesehen und verstanden, dass Kriegsdateien nicht möglich sind! aber das interessante ist, dass, wenn ich den 'absoluten Pfad' von JAR-Dateien im Dateisystem angeben, es funktioniert! ;) – Heidarzadeh

+2

Sie antworten ist völlig inkorrekt. Die Entity-Klassen dürfen nicht zwingend in der JAR-Datei enthalten sein, die als Persistence-Root fungiert. Ganz und gar nicht. Ich weiß in der Tat, dass eine WAR-Datei in Weblogic, Glassfish und TomcateE perfekt eine innere JAR-Datei enthalten kann, die die Datei META-INF/persistence.xml enthält und recht trivial auf andere JAR-Dateien im selben lib-Ordner verweist -file Element mit dem Namen der anderen Gläser. Sie können auch auf Seite 367 und 368 von JPA 2.1 JSR sehen, dass dies der Fall ist. Mit diesen Worten ist die Arbeit in Wildfly 10 eine Herausforderung. – 99Sono

+0

Laden Sie den JSR von hier herunter: http://download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/index.html – 99Sono

0

Nicht sicher, dass dies mit der Tatsache zusammenhängt, dass Sie als WAR bereitstellen, aber der Pfad sollte einfach "app-sevices-1.0.jar" sein und das jar sollte in der lib der Java EE-Anwendung sein. Die Sache ist: Ich bin nicht sicher, ob dies für die vereinfachte "Krieg" Java EE Anwendung verfügbar ist. Ich vermute, dass dies nur für die traditionelle Java EE Deployment-Datei (Ear) verfügbar ist. Ich würde testen, eine EAR, mit einem WAR für die Webapp, JAR für die PU und Ihre anderen JAR für App-Services, wie eine traditionelle Java EE-Bereitstellung wäre.

Eine andere Sache zu beachten ist, dass relative Pfade nicht unterstützt werden, und die Verwendung in SE-Umgebung wird nicht von allen Anbietern unterstützt.

+0

Versuchte den einfachen Pfad "app-services-1.0.jar" und wie Sie vermutet haben, funktioniert es nicht. Also ich denke die Frage ist für Kriegsdateien, dass einfach nicht verwendet werden kann? – Bobo

15

Ein Blick auf jsr funktioniert immer!

8.2.1.6.3 Jar Files

Einer oder mehr JAR-Dateien können in den mapping-file angegebenen Elementen der jar-file Elemente anstelle oder zusätzlich zu den Mapping-Dateien mit angegeben werden. Falls angegeben, werden diese JAR-Dateien nach verwalteten Persistenzklassen durchsucht, und alle auf ihnen gefundenen Mapping-Metadaten-Annotationen werden verarbeitet, oder sie werden mithilfe der Mapping-Annotation-Standardwerte, die durch diese Spezifikation definiert werden, zugeordnet. Solche JAR-Dateien werden relativ zu der Verzeichnis- oder JAR-Datei angegeben, die das Stammverzeichnis der Persistenzeinheit enthält.

Die folgenden Beispiele veranschaulichen die Verwendung des Elements jar-file zum Verweis auf zusätzliche Persistenzklassen. Diese Beispiele verwenden die Konvention, dass eine JAR-Datei mit einem Namen, der mit "PUnit" endet, die Datei persistence.xml enthält und dass eine JAR-Datei mit einem Namen, der mit "Entities" endet, zusätzliche Persistenzklassen enthält.

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> 

Wie Sie sehen es kein Beispiel für den Krieg Dateien ist, werden alle Dateien Krieg in den Beispielen sind oben im Inneren Ohr-Dateien!
Aber ich habe in Kriegsdateien getestet und es funktioniert nur, wenn ich den absoluten Pfad der JAR-Dateien angeben, und es ist kein guter Ansatz für die Produktionsumgebung!

+0

Dies ist die beste Antwort, weil es Beispiele gibt, wofür man sich einsetzt das jar-Dateielement. Bestätigte es, um auch zu arbeiten. –

+0

@Heidarzadeh Wie injiziert man nun einen EntityManager, der auf den Namen der Persistenzeinheit innerhalb von earLibPUnit.jar verweist, zeigt keines der Beispiele, dass – 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> 

Dieses Format funktioniert für War-Datei. Ich benutze Wildlfy 8.2.0 und JPA 2.1

+1

auch mit Payara Server 4.1.1.162 funktioniert #badassfish (Build 116) –

+0

funktioniert auf websphere 8.5.5 – Martin

Verwandte Themen