在 web 应用程序中引用 jpa persistence.xml 中的 jar 文件的正确路径是啥?
Posted
技术标签:
【中文标题】在 web 应用程序中引用 jpa persistence.xml 中的 jar 文件的正确路径是啥?【英文标题】:what is the right path to refer a jar file in jpa persistence.xml in a web app?在 web 应用程序中引用 jpa persistence.xml 中的 jar 文件的正确路径是什么? 【发布时间】:2011-05-24 22:00:47 【问题描述】: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.xml 位于 WEB-INF/classes/META-INF强>文件夹。部署时,它只是告诉我
“警告:找不到文件(已忽略):文件:.../../lib/app-services-1.0.jar”。
我也尝试了所有我能想到的路径,即../lib/app-services-1.0.jar、lib/app-services-1.0.jar.
这样做的正确途径是什么?
【问题讨论】:
您在哪个服务器上运行您的应用程序?老板?玻璃鱼?如果是 JBoss,则根本不需要指定 Hibernate;这是默认设置。 GlassFish,马特。我的问题不在于 Hibernate 与否,而在于如何告诉 JPA 提供者 jar 文件的路径以便自动扫描实体。 【参考方案1】:war2.war
WEB-INF/lib/warEntities.jar
WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
<jar-file>lib/warEntities.jar</jar-file>
这种格式适用于战争文件。我正在使用 Wildlfy 8.2.0 和 JPA 2.1
【讨论】:
也适用于 Payara Server 4.1.1.162 #badassfish (build 116) 在使用 hibernate-5.2.17 作为在 Jetty-9.4.10 中运行的 JPA 提供程序时对我不起作用,openJDK-8 :(【参考方案2】:看看jsr总是有效的!
8.2.1.6.3 jar 文件
可以使用
jar-file
元素指定一个或多个JAR 文件,而不是在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文件的绝对路径时才有效,这对于生产环境来说不是一个好方法!
【讨论】:
这是最好的答案,因为它提供了为 jar-file 元素添加内容的示例。验证它也可以工作。 @Heidarzadeh 现在如何注入一个 EntityManager 引用 earLibPUnit.jar 中的持久性单元名称,没有一个例子表明【参考方案3】:不确定这与您部署为 WAR 的事实有关,但路径应该只是“app-sevices-1.0.jar”,并且 jar 应该在 Java EE 应用程序的 lib 中。问题是:我不确定这是否适用于简化的“战争”Java EE 应用程序。我怀疑这仅适用于传统的 Java EE 部署文件 (ear)。我会测试制作一个 EAR,其中包含用于 webapp 的 WAR、用于 PU 的 JAR 和用于应用服务的其他 JAR,就像传统的 Java EE 部署一样。
另外需要注意的是不支持相对路径,并且并非所有供应商都支持在 SE 环境中使用它。
【讨论】:
尝试了简单的“app-services-1.0.jar”路径,正如您所怀疑的那样,它不起作用。所以我想问题是战争文件,那以防万一其他人偶然发现:jar-file-statement 仅有效。当持久性单元部署为企业档案 (.ear) 的一部分时 - 在所有其他情况下 (.war),持久性.xml 必须驻留在 /META-INF/ 中,并且不能引用驻留在持久性单元之外的类(见:http://javahowto.blogspot.com/2007/06/where-to-put-persistencexml-in-web-app.html)。所以,据我所知,没有办法让持久性.xml 存在于 WEB-INF/classes/META-INF 中,它引用不存在于 WEB-INF/classes 中的类。
【讨论】:
我认为就像ear 文件一样,war 文件也可以这样做,但是经过大量尝试后,我在这里看到了您的帖子,并明白war 文件是不可能的!但有趣的是,当我在文件系统中指定 jar 文件的“绝对路径”时,它可以工作! ;) 你的回答完全不正确。实体类不得强制位于充当持久性根的 JAR 文件中。一点也不。我知道在 Weblogic、Glassfish 和 TomcatEE 中一个 WAR 文件可以完美地包含一个包含 META-INF/persistence.xml 的内部 JAR 文件,并且通过使用 jar-非常简单地引用同一 lib 文件夹中的其他 jar 文件。具有其他 jar 名称的文件元素。您也可以在 JPA 2.1 JSR 的第 367 页和第 368 页中看到这种情况。话虽如此,在 Wildfly 10 中进行这项工作被证明是一项挑战。 从这里下载 JSR:download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/…以上是关于在 web 应用程序中引用 jpa persistence.xml 中的 jar 文件的正确路径是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate5.1.fianl使用JPA注解方式异常:persistence.Table.indexes()[Ljavax/persistence/Index;
JPA中@javax.persistence.Lob注解有啥意义?
不在JPA 的 persistence.xml 文件中配置Entity class的解决办法
Spring JPA (Hibernate) 没有符合条件的 bean 类型:javax.persistence.EntityManagerFactory