web-dev-qa-db-ja.com

Webアプリのjpa persistence.xmlでjarファイルを参照する正しいパスは何ですか?

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>

これはWebプロジェクトなので、デプロイメントユニットはwarファイルです。参照しようとしたjarファイルはWEB-INF/lib /フォルダーにありますpersistence.xmlWEB-INF/classes/META-INFフォルダーにあります。展開されているとき、それは単に私に伝えます

「警告:ファイルが見つかりません(無視されます):file:.../../lib/app-services-1.0.jar」。

また、考えられるすべての可能なパス、つまり../ lib/app-services-1.0.jarlib/app-services-も試しました1.0.jar

これを行う正しい道は何ですか?

22
Bobo

誰かがこれに遭遇した場合に備えて:jar-file-statementは有効なだけです。 persistence-unitがエンタープライズアーカイブ(.ear)の一部としてデプロイされる場合-それ以外の場合(.war)では、persistence.xmlは/ META-INF /に存在する必要があり、persistence-unitの外部にあるクラスを参照できません(参照: http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html )。したがって、私の知る限り、WEB-INF/classesに存在しないクラスを参照するpersistence.xmlをWEB-INF/classes/META-INFに配置する方法はありません。

12
Stefan

Jsrを見ると常に機能します!

8.2.1.6.3 JARファイル

1つ以上のJARファイルは、jar-file要素で指定されたマッピングファイルの代わりに、またはそれに加えて、mapping-file要素を使用して指定できます。指定した場合、これらのJARファイルはマネージ永続クラスを検索し、それらで見つかったマッピングメタデータアノテーションは処理されるか、この仕様で定義されているマッピングアノテーションのデフォルトを使用してマッピングされます。このようなJARファイルは、永続ユニットのルートを含むディレクトリまたはjarファイルを基準にして指定されます。

次の例は、jar-file要素を使用して追加の永続性クラスを参照する方法を示しています。これらの例では、「PUnit」で終わる名前のjarファイルにはpersistence.xmlファイルが含まれ、「Entities」で終わる名前のjarファイルには追加の永続クラスが含まれるという規則を使用しています。

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>

ご覧のとおり、warファイルの例はありません。上の例のすべてのwarファイルは、earファイル内にあります!
しかし、warファイルでテストしましたが、jarファイルの絶対パスを指定した場合にのみ機能し、実稼働環境には適していません。

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

この形式はwarファイルで機能します。私はWildlfy 8.2.0とJPA 2.1を使用しています

8
Pragalathan M

これがWARとしてデプロイしているという事実に関連していることはわかりませんが、パスは単に「app-sevices-1.0.jar」で、jarはJava = EEアプリケーション。問題は、これが単純化された「戦争」で使用できるかどうかわからないJava EEアプリケーション。これは、従来のJava EEデプロイメントファイル(ear)。webappのWAR、PUのJAR、およびapp-servicesのその他のJARを含む従来のJava EEデプロイメントはそうなります。

もう1つ注意すべき点は、相対パスはサポートされておらず、SE環境での使用はすべてのベンダーでサポートされているわけではないことです。

0
jpkrohling