在wildfly模块中找不到持久性单元

时间:2018-03-23 09:57:16

标签: java hibernate module wildfly-10

我的场景如下:我在WildFly服务器上运行了一堆不同的应用程序(WAR)。每个人的一个共同功能是,如果设置了特定的标志,他们应该在数据库中查找某些内容并表现不同(某种类型的高级" kill开关"具有一些更细粒度的可配置性)。

整个事情被实现为一个过滤器,在每个请求上调用(通过一些缓存来避免过于频繁地查询数据库)。如果我在每个单独的war应用程序中集成过滤器逻辑(让它称之为killswitch.jar)(并相应地配置web.xml),那么它的目的和工作应该是这样的。

从可维护性和冗余避免的角度来看,我觉得这有点令人不满意。因此,我希望将整个事物放入WildFly模块中,以避免在每场战争中捆绑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,ClassLoaders或正在加载的模块的顺序。我尝试了一些解决方案,但没有成功。由于我不是野生蝇或JAP专业人士,我现在不知所措并请求您的帮助:

  1. 是否有可能实现我的目标?
  2. 如果是这样,你会怎么做?如果没有,你能想到在每场战争中捆绑killswitch.jar的其他选择吗?
  3. 非常感谢提前!

1 个答案:

答案 0 :(得分:1)

尽管我的情况与您的情况有所不同,但我也遇到了同样的问题,即使它在那里,Wildfly也找不到持久性单元。

经过数小时的努力和搜索,我已经解决了我的问题,只需将persistence.xml放入WAR依赖的一个JAR的META-INF文件夹中即可。

您还可以构建一个仅包含带有persistence.xml文件的META-INF的轻量级jar,或者甚至更好地将其添加到WAR依赖的一个JAR中。

Wildfly的official documentation说明:

  

persistence.xml包含持久性单元配置(例如   数据源名称),并按照JPA 2.0规范(第8.2节)中所述,   其META-INF目录包含以下内容的jar文件或目录   persistence.xml文件称为持久性单元的根。在   在Java EE环境中,持久性单元的根必须是以下之一   以下内容(直接从JPA 2.0规范中引用):

     

     
      
  • EJB-JAR文件
  •   
  • WAR文件的WEB-INF / classes目录
  •   
  • WAR文件的WEB-INF / lib目录中的jar文件
  •   
  • EAR库目录中的jar文件
  •   
  • 应用程序客户端jar文件
  •   
     

请注意,在我找到的许多答案中,第二个选项似乎不起作用。

希望它可以帮助您和其他遇到相同问题的人