使用maven将persistence.xml放在库jar中的哪里?
Posted
技术标签:
【中文标题】使用maven将persistence.xml放在库jar中的哪里?【英文标题】:Where to put persistence.xml in library jar using maven? 【发布时间】:2012-06-07 22:11:04 【问题描述】:在工作中,我们有一个实体库,该库被多个客户端(多个 servlet、桌面应用程序等)使用。实体库由 JPA-Annotated 类和最显着的 persistence.xml 组成。
所有项目都是使用maven配置的。
persistence.xml 文件应该放在哪里?它需要位于该实体库的 jar 文件中,我不确定如何使用 maven 进行配置。
(我们只是将一个项目拆分为几个较小的项目)
'''UPDATE''' 为了明确这一点,有一个 Maven-Project A 包含 persistence.xml 和另一个 (B) 依赖于该项目。我在 A 中的 src/main/resources/META-INF/persistence.xml 中放置了 persistence.xml,当尝试在 A 中使用 EntityManager 时,没问题,insdie 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 中。
【问题讨论】:
【参考方案1】:正如@Dave 上面提到的src/main/resources
就是这个地方。对于persistence.xml
,它应该放在META-INF
文件夹中。所以总结一下:src/main/resources/META-INF/persistence.xml
.
【讨论】:
非常适合我。必须创建一个 META-INF 文件夹并将 persistence.xml 放入其中。 @Sorter 这里也一样。我只是在学习 Hibernate 和 Maven 并且正在拉扯我的头发。很高兴知道这是推荐的方式。 :-) NetBeans 项目中的 src/main/resources 在哪里?【参考方案2】:正如文档所建议的那样,当我将persistence.xml 放置在WEB-INF/classes/META-INF 时,我只能在我的WAR 中工作:
http://docs.oracle.com/cd/E19159-01/819-3669/bnbrj/index.html 声明如下:
如果你将持久化单元打包成一组类在一个WAR文件中,persistence.xml应该位于WAR文件的WEB-INF/classes/META-INF strong> 目录。
在我的 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 可以正常工作。
【讨论】:
这对我的用例很有帮助,但对所提出的问题没有帮助,即在组成 JAR(可能是 WAR)中的persistence.xml
文件周围,而不是直接在 WAR 中。不过,WEB-INF/classes/META-INF
提示是相当有用的奥秘!【参考方案3】:
XML 配置文件几乎总是属于src/main/resources
,在包层次结构中(就像Java 源文件一样)。这些文件将被复制到同一层次结构中的工件中。
【讨论】:
关于包层次结构的注释在这个问题的上下文中是不正确的。 JPA 要求将 persistence.xml 存储在 Maven 项目中的特定位置,如其他答案中所述。 @RobertDean 不过,这仍然是正确的节奏,它仍然会被复制到正确的位置——它是一个“元”包并不是非常相关,正如另一个答案。 耸耸肩 不知道为什么一个 7 年前的问题/答案最近受到关注。【参考方案4】:在 maven pom.xml 文件中你必须添加资源目录,所以你不必手动将它添加到 eclipse 中的 build-path 中。
<project>
...
<build>
...
<resources>
<resource>
<directory>src/resources</directory>
</resource>
</resources>
...
</build>
...
</project>
见:http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
【讨论】:
你应该把它放在src/main/resources
中,这是maven默认的,是自动添加的【参考方案5】:
只是提到我遇到的一个类似问题,它一直让我想到这个问题,所以这可能会帮助像我一样不太熟悉 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 项目树以进行同步)。
【讨论】:
以上是关于使用maven将persistence.xml放在库jar中的哪里?的主要内容,如果未能解决你的问题,请参考以下文章
Google 应用引擎的 gradle 单元测试在哪里期望 persistence.xml?
META-INF/persistence.xml 无法打开,因为它不存在