在同一个 Tomcat 服务器上部署 JSF 1.2 和 JSF 2.0 应用程序
Posted
技术标签:
【中文标题】在同一个 Tomcat 服务器上部署 JSF 1.2 和 JSF 2.0 应用程序【英文标题】:Deploying both JSF 1.2 and JSF 2.0 apps on same Tomcat Server 【发布时间】:2011-08-18 08:50:47 【问题描述】:到目前为止,我一直在 Tomcat 6.0 上运行 JSF 1.2 应用程序。 我现在已经在另一个 Tomcat 实例上启动了一个新的 JSF 2.0 项目(用于测试)。
我想在 Tomcat 6.0 主服务器上部署新的 JSF 2.0 项目,并面临“告诉”新项目使用 2.0 库而旧项目应继续使用旧库的挑战。
每个服务器的所有库都是通用的(尽管构建路径显然是每个项目的)。 我想知道的是如何告诉项目使用 JSF 2.0 API。
谢谢!
【问题讨论】:
【参考方案1】:Tomcat 根本不附带 JSF,因此只需在 /WEB-INF/lib
中为每个项目提供自己正确版本的 JSF 库就可以正常工作。
更新 我忽略了 JSF 1.2 库是由 Tomcat 本身提供的。在这种情况下,您需要将 Tomcat 中的 JSF 1.2 库升级到 JSF 2.0 库。 JSF 2.0 与 JSF 1.2 完全向后兼容。对于 Tomcat 服务器,无法以某种方式配置 webapp,以使用 webapp 提供的库覆盖 Tomcat 提供的库。您最终会在类路径中发生冲突。
【讨论】:
我们在没有库的情况下进行部署。正如我提到的“所有库都是每个服务器通用的”。 从一开始就是个坏主意。我不太明白 Jigar 的答案是如何解决这个问题的。 Tomcat 提供的那些仍然会优先于 webapp 中的那些。更多成熟的应用程序服务器具有特定的配置设置,可以让 webapps 覆盖服务器提供的库,另请参阅***.com/questions/5815623/… 在任何情况下,您应该能够在将 Tomcat-libs 从 1.2 更新到 2.0 的同时继续使用 JSF 1.2 应用程序。 JSF 2.0 完全向后兼容 JSF 1.2。 这样做是为了减少部署的规模。还有其他方法吗?我看不出通过构建路径引用库并不比在war
文件中包含实际库更好。 (似乎是库重复混乱)仅仅是因为没有更好的解决方案吗?
Tomcat 库在类加载中优先于 webapp 库。对于 Tomcat,您不能从 webapp 端更改它。 IDE 构建路径无关紧要。还是你自己测试过?
对不起,我现在明白你的意思了。对于 API,将加载 webapp 提供的库,但对于 impl,这不会发生,而是会加载 appserver 提供的库。 JSP/Servlet/JSF/etc 存在 2 个库:API 和 impl。 API 是您在类中导入的任何内容。 javax.faces.*
等等。它几乎是一个和所有的接口和抽象类。然而,impl 是真正的具体代码。对于 Mojarra,这是 com.sun.*
类。因此,如果您将 JSF 1.2 API/impl 放在 Tomcat 中,并将 JSF 2.0 API/impl 放在 webapp 中,那么您的 webapp 将使用 JSF 2.0 API 和 JSF 1.2 impl 运行。这发生了冲突。【参考方案2】:
你可以将 JSF jar 从 Tomcat 的类路径中取出,并在每个 WAR 中打包所需的版本,除此之外,我认为你无法做到......
【讨论】:
【参考方案3】:嗯.. 你只需要在你的类路径中提供所需的库,你需要做these changes in your configurations 它应该选择正确的库
【讨论】:
以上是关于在同一个 Tomcat 服务器上部署 JSF 1.2 和 JSF 2.0 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 Tomcat DataSourceRealm 的 JSF 项目表单认证
将基于 Maven 的 JSF 项目部署到 Tomcat 会导致 java.lang.ClassNotFoundException:javax.faces.webapp.FacesServlet [重