4

我们有一个库,其中包含对 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。这行得通,但肯定有更好的方法吗?
4

2 回答 2

3

由于某些分发/许可问题,他们可能使用不同的 API jar。我不知道确切。但是 API 是一样的,你的 FacesContextFactory 也可以在 myfaces-api jar 中找到。

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

可能值得在这里查看 Gradle - 我总是遇到需要采用不同依赖项集的项目的问题,并且我在那里看到了一些不错的功能。

抱歉,我也没有为这个设置找到好的解决方案。

编辑:同时思考:您可以在 SCM 中创建两个分支并合并它们之间的更改?(当然除了依赖项)

于 2012-08-02T08:36:08.980 回答
2

为什么 Mojarra 和 MyFaces 使用不同的 API jar?两者都实现了相同的 API (JSF),所以他们不应该使用相同的 API jars 吗?

它们是 JSF 的独立实现。JSF 是一个规范。看到这个问题

更具体地说:对于只应依赖 JSF API 的库,正确的 Maven 依赖项是什么?现在,我们依赖jsf-api,使用MyFaces的项目必须使用丢弃jsf-api并包含myfaces-api。这行得通,但肯定有更好的方法吗?

您所说的“JSF API”是它的 Sun/Oracle 实现(Mojarra)。这些的依赖项是:

<dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.1.2</version>
        </dependency>
于 2012-07-31T22:17:22.087 回答