在 wildfly 模块中找不到持久性单元
Persistence unit not found in wildfly module
我的场景如下:我在 WildFly 服务器上有一堆不同的应用程序 (WAR) 运行。他们每个人的一个共同功能是,如果设置了特定标志,他们应该在数据库中查找某些内容并表现不同(有点高级"kill switch",具有更细粒度的可配置性)。
整个事情被实现为一个过滤器,在每次请求时调用(有一些缓存以避免过于频繁地查询数据库)。如果我在每个 war 应用程序中集成过滤器逻辑(让我们称之为 killswitch.jar
)(并相应地配置 web.xml
),这是有意为之的,并且可以正常工作。
从可维护性和避免冗余的角度来看,我觉得这有点不满意。因此,我想将整个东西放入 WildFly 模块中,以避免在每个 war 中捆绑 jar。我将 jar 和 module.xml
(如下所示)放在正确的位置并加载模块。
module.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="my.company.domain.killswitch">
<resources>
<resource-root path="killswitch.jar"/>
</resources>
<dependencies>
<module name="org.jboss.logging"/>
<module name="javax.api"/>
<module name="com.microsoft.sqlserver"/>
<module name="org.slf4j.jcl-over-slf4j"/>
<module name="org.jboss.as.web" />
<module name="javax.servlet.api" />
<module name="javax.persistence.api" />
<module name="javax.api"/>
<module name="javax.inject.api"/>
<module name="org.hibernate" services="import"/>
</dependencies>
</module>
(事实上,这不是全部真相:这个模块是在模块层次结构中加载的。模块 A 依赖于模块 B,模块 B 依赖于这个模块。但正如我所见,这三个模块都有效其中的一部分已加载,所以恕我直言,这无关紧要。)
问题是,在服务器启动时找不到模块中定义的持久性单元:
Can't find a persistence unit named 'Killswitch' in deployment MyAwesomeApplication.war
但是,如您所想,持久性单元就在那里。 persistence.xml
当然也是,而且它格式正确且有效。我可以肯定地确认这一点,因为如果使用 not 作为模块,它无需任何更改即可工作。
我已经阅读了几个关于类似问题的讨论帖。某些状态,不可能实现,我试图做到。其他人谈论 META-INF
、类加载器或加载模块的顺序。我尝试了一些解决方案,但没有成功。由于我不是wildfly或JAP专业人士,我现在很茫然,请求您的帮助:
- 是否有可能实现我的目标?
- 如果是这样,你会怎么做?如果没有,你能想出任何其他替代方法来将
killswitch.jar
捆绑在每个 war 中吗?
非常感谢!
尽管我的情况与您的不同,但我遇到了 Wildfly 找不到持久性单元的相同问题,即使它在那里。
经过数小时的努力和搜索,我解决了我的问题,只需将我的 persistence.xml 放入我的 WAR 所依赖的 JAR 之一的 META-INF 文件夹中即可。
您还可以构建一个仅包含带有 persistence.xml 文件的 META-INF 的轻量级 jar,或者甚至更好地将其添加到您的 WAR 所依赖的 JAR 之一中。
Wildfly 的 official documentation 是这样说的:
The persistence.xml contains the persistence unit configuration (e.g.
datasource name) and as described in the JPA 2.0 spec (section 8.2),
the jar file or directory whose META-INF directory contains the
persistence.xml file is termed the root of the persistence unit. In
Java EE environments, the root of a persistence unit must be one of
the following (quoted directly from the JPA 2.0 specification):
"
- an EJB-JAR file
- the WEB-INF/classes directory of a WAR file
- a jar file in the WEB-INF/lib directory of a WAR file
- a jar file in the EAR library directory
- an application client jar file
"
请注意,在我发现的许多答案中,第二个选项似乎不起作用。
希望对遇到同样问题的您和其他人有所帮助
我的场景如下:我在 WildFly 服务器上有一堆不同的应用程序 (WAR) 运行。他们每个人的一个共同功能是,如果设置了特定标志,他们应该在数据库中查找某些内容并表现不同(有点高级"kill switch",具有更细粒度的可配置性)。
整个事情被实现为一个过滤器,在每次请求时调用(有一些缓存以避免过于频繁地查询数据库)。如果我在每个 war 应用程序中集成过滤器逻辑(让我们称之为 killswitch.jar
)(并相应地配置 web.xml
),这是有意为之的,并且可以正常工作。
从可维护性和避免冗余的角度来看,我觉得这有点不满意。因此,我想将整个东西放入 WildFly 模块中,以避免在每个 war 中捆绑 jar。我将 jar 和 module.xml
(如下所示)放在正确的位置并加载模块。
module.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="my.company.domain.killswitch">
<resources>
<resource-root path="killswitch.jar"/>
</resources>
<dependencies>
<module name="org.jboss.logging"/>
<module name="javax.api"/>
<module name="com.microsoft.sqlserver"/>
<module name="org.slf4j.jcl-over-slf4j"/>
<module name="org.jboss.as.web" />
<module name="javax.servlet.api" />
<module name="javax.persistence.api" />
<module name="javax.api"/>
<module name="javax.inject.api"/>
<module name="org.hibernate" services="import"/>
</dependencies>
</module>
(事实上,这不是全部真相:这个模块是在模块层次结构中加载的。模块 A 依赖于模块 B,模块 B 依赖于这个模块。但正如我所见,这三个模块都有效其中的一部分已加载,所以恕我直言,这无关紧要。)
问题是,在服务器启动时找不到模块中定义的持久性单元:
Can't find a persistence unit named 'Killswitch' in deployment MyAwesomeApplication.war
但是,如您所想,持久性单元就在那里。 persistence.xml
当然也是,而且它格式正确且有效。我可以肯定地确认这一点,因为如果使用 not 作为模块,它无需任何更改即可工作。
我已经阅读了几个关于类似问题的讨论帖。某些状态,不可能实现,我试图做到。其他人谈论 META-INF
、类加载器或加载模块的顺序。我尝试了一些解决方案,但没有成功。由于我不是wildfly或JAP专业人士,我现在很茫然,请求您的帮助:
- 是否有可能实现我的目标?
- 如果是这样,你会怎么做?如果没有,你能想出任何其他替代方法来将
killswitch.jar
捆绑在每个 war 中吗?
非常感谢!
尽管我的情况与您的不同,但我遇到了 Wildfly 找不到持久性单元的相同问题,即使它在那里。
经过数小时的努力和搜索,我解决了我的问题,只需将我的 persistence.xml 放入我的 WAR 所依赖的 JAR 之一的 META-INF 文件夹中即可。
您还可以构建一个仅包含带有 persistence.xml 文件的 META-INF 的轻量级 jar,或者甚至更好地将其添加到您的 WAR 所依赖的 JAR 之一中。
Wildfly 的 official documentation 是这样说的:
The persistence.xml contains the persistence unit configuration (e.g. datasource name) and as described in the JPA 2.0 spec (section 8.2), the jar file or directory whose META-INF directory contains the persistence.xml file is termed the root of the persistence unit. In Java EE environments, the root of a persistence unit must be one of the following (quoted directly from the JPA 2.0 specification):
"
- an EJB-JAR file
- the WEB-INF/classes directory of a WAR file
- a jar file in the WEB-INF/lib directory of a WAR file
- a jar file in the EAR library directory
- an application client jar file
"
请注意,在我发现的许多答案中,第二个选项似乎不起作用。
希望对遇到同样问题的您和其他人有所帮助