【问题标题】:How to correctly use OmniFaces in an EAR如何在 EAR 中正确使用 OmniFaces
【发布时间】:2016-03-19 21:38:01
【问题描述】:

我想在我的 Jave EE 7 应用程序中使用 OmniFaces 1.7。我的应用程序是一个包含 JAR 和 skinny WAR 的 EAR。我的一些 JAR 依赖于 OmniFaces,因此 OmniFaces 工件必须在 EAR 中,但不能在 WAR 中的 WEB-INF/lib 中。

这是我的 EAR 的样子:

EAR
 +-- lib
 |    +-- [some 3rd party JARs]
 |    `-- omnifaces.jar
 +-- myEJBs.jar
 `-- myWAR.war

当我这样说时,OmniFaces 转换器(如GenericEnumConverter)没有在 JSF 中注册并且无法工作。对此的原因在herehere 进行了讨论。基本上按照JSF 2.0 Spec11.5.1 扫描类注解的要求节),只扫描WARs的WEB-INF/lib目录。

所以我的问题是:我应该如何在我的应用程序中包含 OmniFaces

包含它两次(在EAR/lib 和 WARs WEB-INF/lib 中)可能会起作用,但感觉很笨拙。我前段时间用 RichFaces 4.3.5(同样的问题)尝试过,但没有成功,但导致IllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter

【问题讨论】:

  • OmniFaces' known issues page 声明:“还应注意的是,由于依赖项通常仅在 WAR 中可用,例如 JSF、Servlet 和 EL,因此 OmniFaces 不能简单地包含为 EAR 库。 "但是如果我想在我的 EJB 中使用像 org.omnifaces.config.BeanManager 这样的类呢?
  • 在 maven-users 列表上的 discussion 之后,我认为 OmniFaces 的类(如 BeanManager 或 Utils)目前不应在 WAR 之外的类中使用。一种解决方案可能是将 OmniFaces 拆分为两个单独的 JAR:一个真正的 JSF 组件库和一个可在任何地方使用的通用库。

标签: jsf-2 ear omnifaces skinny-war


【解决方案1】:

OmniFaces 是一个 JSF 实用程序库,它依赖于 JSF、EL 和 Servlet API,这些 API 通常只能在 WAR 中使用,而不是 EAR。更重要的是,您的 EJB(一般的业务服务)不应依赖于特定的前端 API,例如 JSF、EL 和 Servlet API。这将使它们在其他前端(例如 JAX-RS、Spring MVC 等)上无法重用。

您需要将 JSF 实用程序和组件库(例如 OmniFaces 和 PrimeFaces)放在 WAR 中,而不是 EAR 中。另请参阅 OmniFaces 主页的Installation 部分:

OmniFaces 被设计为 WAR 库(Web 片段库),因此不能放置在 WAR 自己的 /WEB-INF/lib 之外的 webapp 运行时类路径中的其他位置,例如 EAR 的 /lib 甚至服务器或 JRE 自己的 /lib .当 OmniFaces JAR 文件以这种方式放错位置时,Web 应用程序将无法找到 OmniFaces 捆绑的 JSF/CDI 注释类,并在部署或运行​​时抛出与此相关的异常。要解决这个问题,请将 OmniFaces 放回 WAR 的 /WEB-INF/lib

另见:

【讨论】:

  • 仅作记录:我只依赖于 OmniFaces 的 BeanManager 类(如 issue tracker 中所讨论的)。在 EJB 中使用 CDI 是一个有效的用例。但我最终得到了您建议将 OmniFaces 放入 WAR 的解决方案。谢谢。
猜你喜欢
  • 2013-09-30
  • 1970-01-01
  • 2015-04-19
  • 2012-10-16
  • 1970-01-01
  • 2012-12-12
  • 2019-06-04
  • 2011-07-07
相关资源
最近更新 更多