我想在我的Jave EE 7应用程序中使用OmniFaces 1.7。我的应用程序是一个包含JAR和一个瘦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中注册,也不起作用。原因在这里和这里讨论。基本上,根据JSF 2.0规范(111.5.1注释类扫描要求),只扫描WARsWEB-INF/lib
目录。
所以我的问题是:我应该如何在应用程序中包含OmniFaces?
包括两次(在EAR/lib
和WARWEB-INF/lib
中)可能会起作用,但感觉很笨拙。不久前,我在RichFaces 4.3.5(同样的问题)中尝试了它,但没有成功,但导致了IllegalArgumentException: duplicate key: class javax.faces.convert.ByteConverter
。
OmniFaces是一个JSF实用程序库,它依赖于JSF、EL和Servlet API,这些API通常只能在WAR中使用,而不能在EAR中使用。更重要的是,EJB(一般的业务服务)不应该对特定的前端API(如JSF、EL和Servlet API)有任何依赖关系。这将使它们在其他前端(如JAX-RS、SpringMVC等)上不可用。
您需要将JSF实用程序和组件库(如OmniFaces和PrimeFaces)放在WAR中,而不是放在EAR中。另请参阅OmniFaces主页的安装部分:
OmniFaces被设计为WAR库(web片段库),因此不能放在WAR自己的
/WEB-INF/lib
之外的web应用程序运行时类路径中的其他位置,例如EAR的/lib
,甚至服务器或JRE自己的/lib
。当OmniFacesJAR文件以这种方式放错位置时,Web应用程序将无法找到OmniFaces捆绑的JSF/CDI注释类,并在部署或运行时抛出与此相关的异常。要解决这个问题,请将OmniFaces放回WAR的/WEB-INF/lib
中。
另请参阅:
- JSF服务层
- @共享库上的FacesComponent
- @Eagle不可用。无法从CDI bean管理器获取EagleBeansRepository