在使用Maven时,在库JAR中放置persistence.xml文件的位置应该在哪里?

41
在工作中,我们有一个实体库,它被多个客户端用于该库(多个servlet、桌面应用程序等)。该实体库由使用JPA注释的类组成,最突出的是一个persistence.xml。
所有项目都使用maven进行配置。 persistence.xml文件应该放在哪里?它需要位于该实体库的jar文件内部,我不确定如何使用maven进行配置。
(我们只是将一个项目拆分成了几个较小的项目)
'''更新''' : 为了明确这一点,有一个Maven-Project A,其中包含persistence.xml,还有另一个(B)依赖于该项目。我在A的src/main/resources/META-INF/persistence.xml中放置了persistence.xml,当尝试在A中使用EntityManager时,没有问题,在B内部:什么也不起作用。
EclipseLink 给出以下警告:
[EL Warning]: The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units.  Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element

我怀疑无法找到persistence.xml,但它在目标JAR包中存在。

5个回答

88

正如 @Dave 上面提到的那样,src/main/resources 是正确的位置。当涉及到 persistence.xml 时,它应该放置在 META-INF 文件夹中。因此,总结一下:src/main/resources/META-INF/persistence.xml


3
对我来说,效果非常好。必须创建一个名为“META-INF”的文件夹,并将persistence.xml放在其中。 - Sorter
@Sorter 我也一样。我正在学习Hibernate和Maven,而且感到很困难。很高兴知道这是推荐的方法。 :-) - ankush981
在NetBeans项目中,src/main/resources在哪里? - myverdict

15
我只能在WEB-INF/classes/META-INF中放置persistence.xml,才能让它在WAR包中正常工作,就像文档建议的那样。http://docs.oracle.com/cd/E19159-01/819-3669/bnbrj/index.html中指出:

如果您将持久化单元打包为一个WAR文件中的一组类,则persistence.xml应该位于WAR文件的WEB-INF/classes/META-INF目录中。

在我的Eclipse项目属性中,我将以下内容添加到构建路径中:

src\main\resources

我的Maven项目中,persistence.xml位于以下位置:

src\main\resources\META-INF\persistence.xml

运行 Maven clean install 后,将会构建一个 WAR 包,其中包含:

WEB-INF\classes\META-INF\persistence.xml

当我将这个WAR文件拖放到Tomcat 7的webapps文件夹中时,它能够成功部署并且JPA正常工作。

1
这对我的使用情况很有帮助,但并不适用于所问的问题,该问题涉及到组成JAR(可能是WAR)中的persistence.xml文件,而不是直接在WAR中。然而,WEB-INF/classes/META-INF提示非常有用! - Nick Maynard

5

XML配置文件几乎总是放在src/main/resources中,以包层次结构的形式存在(就像Java源代码文件一样)。这些文件将被复制到同一层次结构的构件中。


在这个问题的背景下,关于包层次结构的注释是不正确的。JPA要求将persistence.xml存储在Maven项目的特定位置,正如其他答案中所指出的那样。 - Robert Dean
@RobertDean 不过,这仍然是正确的步伐,并且它仍将被复制到正确的位置 - 它是一个“元”包并不是非常相关的,正如其他答案中所指出的那样。 耸肩 不知道为什么一个大约7年的问题/答案最近受到关注。 - Dave Newton

3

7
应该将其放在src/main/resources目录中,这是Maven的默认设置,并会自动添加。 - Jannik Jochem

1

我想提到一个类似的问题,这个问题一直让我来到这里,所以这可能会帮助其他像我一样不太熟悉Maven的人。

我在Eclipse中有一个独立的Java SE Maven项目,其中包含hibernate-hikaricp依赖项,并且我已经在<project_name>/src/main/resources/META-INF文件夹中正确添加了persistence.xml文件,这是用于此类JSE项目的Maven默认资源文件夹。

项目的pom.xml包括一个maven-resources-plugin插件,但我不确定它是否与该问题有关。

重点是,我试图从Eclipse内部作为Java应用程序运行该项目(您知道,从具有公共静态main(String [] args)方法的主类),但运行时日志不断显示无法找到META-INF/persistence.xml,即使它在正确的文件夹中。

事实证明,我必须重新构建项目,以便将 persistence.xml 文件重新发送到正确的目标输出文件夹。因此,对项目进行了 clean(我认为这根本不必要,但你知道,我们尝试了一些东西),然后进行了 build,问题得到解决。我是从 Eclipse 中调用它们的,但我相信使用 mvn 从命令行调用也可以(我只需要在同步之前可能要刷新 Eclipse 项目树)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接