我们有一个库,其中包含对 JSF 提供的功能的少量补充(例如额外的 ResourceHandlers)。
由于它使用 JSF 类(来自javax.faces.*
包),它自然必须依赖 JSF API。该库被打包为一个 Maven 项目,并且依赖于com.sun.faces:jsf-api
.
这适用于编译,也适用于使用 Mojarra 的项目。但是,如果我们在使用 MyFaces 的 JSF 应用程序中包含该库,则会出现错误,如Exception: could not find Factory: javax.faces.context.FacesContextFactory中所述。
显然,如果一个应用程序使用 MyFaces,它必须使用 myfaces-api.jar 和 myfaces-impl.jar(或相应的 Maven deps),而不是jsf-api.jar 或 jsf-impl.jar。
这让我有点困惑。
- 为什么 Mojarra 和 MyFaces 使用不同的 API jar?两者都实现了相同的 API (JSF),所以他们不应该使用相同的 API jars 吗?
- 我认为拥有单独的“api”和“impl”罐子的全部意义在于只有“impl”部分必须切换以使用不同的实现。我是不是误会了什么?
- 更具体地说:对于只应依赖 JSF API 的库,正确的 Maven 依赖项是什么?现在,我们依赖jsf-api,使用MyFaces的项目必须使用
<exclusions>
丢弃jsf-api并包含myfaces-api。这行得通,但肯定有更好的方法吗?