我想在我的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中注册,也无法正常工作。我们讨论了here和here的原因。基本上根据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
。
答案 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
。