如何在EAR中正确使用OmniFaces

时间:2014-02-26 15:51:22

标签: jsf-2 ear omnifaces skinny-war

我想在我的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 Spec 11.5.1扫描类注释的要求),只扫描WAR WEB-INF/lib目录。

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

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

1 个答案:

答案 0 :(得分:4)

OmniFaces是一个JSF实用程序库,依赖于JSF,EL和Servlet API,它们通常只在WAR内部可用,而不是EAR。更重要的是,您的EJB(一般的业务服务)不应该对特定的前端API(如JSF,EL和Servlet API)有任何依赖性。它会使它们在其他前端如JAX-RS,Spring MVC等无法使用。

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

  

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

另见: