2010-12-13 4 views
19

persistence.xml ressemble à ceci:Quel est le bon chemin pour référencer un fichier jar dans jpa persistence.xml dans une application 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> 

Il est un projet web, de sorte que l'unité de déploiement est un fichier de guerre. Le fichier jar j'ai essayé de se référer est dans dossier WEB-INF/lib/, persistence.xml est dans WEB-INF/classes/dossier META-INF. Lors du déploiement, il me dit simplement

"AVERTISSEMENT: Impossible de trouver le fichier (ignoré): fichier: .../../lib/app-services-1.0.jar".

J'ai aussi essayé tous les chemins possibles que je pouvais penser, à savoir ../lib/app-services-1.0.jar, lib/app-services 1.0.jar.

Quel est le bon chemin pour faire cela?

+0

Sur quel serveur exécutez-vous votre application? JBoss? GlassFish? Si c'est JBoss, vous ne devriez pas avoir besoin de spécifier Hibernate du tout; c'est le défaut. –

+1

GlassFish, Matt. Mon problème n'est pas sur Hibernate ou non, il s'agit de savoir comment dire au fournisseur JPA le chemin vers le fichier jar afin de scanner automatiquement les entités. – Bobo

Répondre

12

juste au cas où quelqu'un d'autre trébucherait sur ceci: l'instruction jar-file n'est valide que. lorsque l'unité persistence est déployée dans le cadre d'une archive d'entreprise (.ear) - dans tous les autres cas (.war), le fichier persistence.xml doit résider dans/META-INF/et ne peut pas réorienter les classes hors de l'unité de persistance (Voir: http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html). Donc, pour autant que je sache, il n'y a aucun moyen d'avoir un persistence.xml vivant dans WEB-INF/classes/META-INF qui fait référence à des classes qui ne vivent pas dans WEB-INF/classes.

+1

Je pensais que comme les fichiers d'oreille, c'est aussi possible pour les fichiers de guerre mais après avoir essayé beaucoup, j'ai vu votre message ici et je comprends que ce n'est pas possible pour les fichiers war! mais la chose intéressante est que lorsque je spécifie le «chemin absolu» des fichiers jar dans le système de fichiers, cela fonctionne! ;) – Heidarzadeh

+2

Vous répondez est complètement incorrect. Les classes d'entité ne doivent pas être forcément à l'intérieur du fichier JAR qui agit en tant que racine de persistance. Pas du tout. Je sais pertinemment que dans Weblogic, Glassfish et TomcatEE, un fichier WAR peut parfaitement contenir un fichier JAR interne qui contient le fichier META-INF/persistence.xml et se réfère plutôt à d'autres fichiers jar dans le même dossier lib en utilisant le fichier jar -file avec le nom des autres pots. Vous pouvez également voir dans les pages 367 et 368 de JPA 2.1 JSR que c'est le cas. Cela dit, faire ce travail dans Wildfly 10 est un défi de taille. – 99Sono

+0

Télécharger le JSR à partir d'ici: http://download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/index.html – 99Sono

0

Vous n'êtes pas sûr que cela soit lié au fait que vous vous déployez en tant que WAR, mais que le chemin soit simplement "app-sevices-1.0.jar" et que le fichier jar soit dans la bibliothèque de l'application Java EE. La chose est: je ne suis pas sûr si cela est disponible pour l'application Java EE "war" simplifiée. Je suspecte que ceci est disponible seulement pour le dossier traditionnel de déploiement de Java EE (oreille). Je testerais la création d'un EAR, contenant un WAR pour la webapp, JAR pour le PU et votre autre JAR pour les services d'application, comme un déploiement Java EE traditionnel.

Une autre chose à noter est que les chemins relatifs ne sont pas pris en charge et que l'utilisation de cet environnement dans SE n'est pas prise en charge par tous les fournisseurs.

+0

Essayé le chemin "app-services-1.0.jar" simple et comme vous le suspectiez, cela ne fonctionne pas. Donc, je suppose que la question est pour les fichiers de guerre, que ne peut tout simplement pas être utilisé? – Bobo

15

Jetez un oeil à jsr fonctionne toujours!

8.2.1.6.3 Jar Fichiers

Un ou plusieurs fichiers JAR peuvent être spécifiés à l'aide des éléments jar-file au lieu de, ou en plus des fichiers de mappage spécifiés dans les mapping-file éléments. Si spécifié, ces fichiers JAR seront recherchés pour les classes de persistance gérées, et toutes les annotations de métadonnées de mappage trouvées sur ces fichiers seront traitées, ou elles seront mappées à l'aide des valeurs par défaut d'annotation de mappage définies par cette spécification. De tels fichiers JAR sont spécifiés par rapport au répertoire ou au fichier jar contenant la racine de l'unité de persistance.

Les exemples suivants illustrent l'utilisation de l'élément jar-file pour référencer des classes de persistance supplémentaires. Ces exemples utilisent la convention qu'un fichier jar avec un nom se terminant par "PUnit" contient le fichier persistence.xml et qu'un fichier jar avec un nom se terminant par "Entités" contient des classes de persistance supplémentaires.

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> 

Comme vous le voyez il n'y a pas d'exemple pour les fichiers de guerre, tous les fichiers de guerre dans les exemples ci-dessus sont des fichiers à l'intérieur de l'oreille!
Mais j'ai testé dans des fichiers war et ça fonctionne juste quand je spécifie le chemin absolu des fichiers jar et ce n'est pas une bonne approche pour l'environnement de production!

+0

Ceci est la meilleure réponse, car il donne des exemples de quoi mettre pour l'élément jar-file. Vérifié pour travailler aussi bien. –

+0

@Heidarzadeh Comment injecte-t-on maintenant un EntityManager référençant le nom de l'unité de persistance dans earLibPUnit.jar, aucun des exemples ne montre 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> 

ce format fonctionne pour le fichier de guerre. Im utilisant Wildlfy 8.2.0 et JPA 2.1

+1

fonctionne aussi avec Payara Server 4.1.1.162 #badassfish (build 116) –

+0

fonctionne sur websphere 8.5.5 – Martin

Questions connexes