api – 使用JSF的库的Maven依赖项,应该与Mojarra或MyFaces一起使用

我们有一个库,其中包含JSF提供的少量功能(如额外的ResourceHandlers之类的东西).

因为它使用JSF类(来自javax.faces.* packages),所以它自然必须依赖于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),and not jsf-api.jar or jsf-impl.jar.

这让我有点困惑.

>为什么Mojarra和MyFaces使用不同的API罐?两者都实现了相同的API(JSF),所以它们不应该使用相同的API jar吗?
>我认为分离“api”和“impl”罐子的全部意义在于,只有“impl”部分必须切换为使用不同的实现.我误解了什么吗?
>更具体地说:对于一个应该只依赖于JSF API的库,Maven的正确依赖是什么?现在,我们依赖于jsf-api,使用MyFaces的项目必须使用< exclusions>抛出jsf-api并包含myfaces-api.这有效,但肯定有更好的方法吗?

最佳答案
由于某些分发/许可问题,他们可能会使用不同的API jar.我完全不知道.
但是API是相同的,你的FacesContextFactory也可以在myfaces-api jar中找到.

我会尝试创建配置文件(甚至两个单独的模块)来定义相应的依赖项集.使用配置文件,您需要手动激活其中一个以切换依赖项.使用模块都可以构建,但是问题在哪里放置源代码,但依赖项可以设置为编译,因此创建可交付项将更容易.

在这里看Gradle可能是值得的 – 我总是遇到需要采用不同依赖关系的项目的问题,我在那里看到了一些不错的功能.

对不起,我还没有找到适合此设置的好解决方案.

编辑:同时思考:您可能只是在SCM中创建两个分支并合并它们之间的变化? (当然除了依赖性)

转载注明原文:api – 使用JSF的库的Maven依赖项,应该与Mojarra或MyFaces一起使用 - 代码日志