3

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

这是我的 EAR 的样子:

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

当我这样说时,OmniFaces 转换器(如GenericEnumConverter)没有在 JSF 中注册并且无法工作。此处此处讨论了其原因。基本上根据JSF 2.0 Spec(第11.5.1 节对扫描类注解的要求),只扫描 WARsWEB-INF/lib目录。

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

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

4

1 回答 1

4

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 主页的安装部分:

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

也可以看看:

于 2014-06-06T08:27:44.583 回答