使用自定义 DI 框架的自定义 JSF 实现

Custom JSF Implementation With Custom DI Framework

作为 JSF 2.3,@ManagedBean 和其他 javax.faces.bean.* 注释已弃用并替换为 JavaEE 6 CDI。

我成功制作了一个示例 JSF 项目并使用服务器实现 'glassfish.jsf.jar' 将其部署到 WebLogic,并且在 WEB-INF/lib.

中没有实现 JSF 或 CDI

但我担心有时可能会过时的服务器实现会卡住 + 我的应用程序在不同的应用程序服务器上工作时表现不同,所以我认为如果我能控制 JSF 实现会更好。

我花了最后 4 天时间寻找一种方法来使用自定义 JSF 实现(Mojarra 或 MyFaces),使用新的 CDI 注释或任何其他 DI 框架,但没有成功。

我知道如果我想摆脱 @ManagedAnnotations,我必须使用 JSF 和 CDI 的 JavaEE 服务器实现。

我的问题:有没有办法在我的 WAR 中包含我首选的 JSF 和 CDI 实现,它们将被部署到不同的应用程序服务器,如 WebLogic 和 WildFly。

注意:我发现了 2013 年的 old question 答案为“否”,但我想知道这个答案是否仍然有效

编辑 2018 年 2 月 11 日: 我在 Tomcat 服务器上成功安装了一个带有嵌入式 JSF (Mojarra) 和 CDI (Weld) 的项目,没有任何问题。我认为这是因为 Tomcat 是 Servlet Container 所以没有冲突。

我认为我的问题是因为我的嵌入式 CDI 和 Weld 的服务器实现版本之间存在冲突。我找不到使我的应用程序成为黑盒的解决方案。

我用过这个weblogic.xml 假

    <prefer-application-packages>
        <package-name>!javax.servlet.*</package-name>   
    </prefer-application-packages>

    <prefer-application-resources>
        <resource-name>!javax.servlet.*</resource-name>
    </prefer-application-resources>

另一个答案仍然有效。但是还有其他(更好的)选择

1 同时提供完整的 java-ee 容器作为您应用程序的一部分。

2 需要特定应用服务器的最低版本

3 告诉客户他们至少需要某些库的特定版本