我们目前正在将应用程序从生产环境迁移到全新的数据中心。

  • 当前生产环境:Java 1.4、Java EE 3、WAS 5.1、JSF 2.1
  • 新数据中心环境:Java 1.5、Java EE 5、WAS 6.1、JSF 2.1
我们的应用程序基于 JSF 2.1 构建,并在 AJAX 调用之一中包含以下代码:
request.getSession().getServletContext().getRequestDispatcher(
                    "/results.faces").include(request, response);
这就是我们遇到问题的地方。

情况1:EAR 结构符合标准规范
. 。EAR -> WAR -> WEB-INF -> lib -> *.jar(所有应用程序特定的 jar 都位于 WEB-INF/lib 下)。这不起作用,我们继续获取类加载器未找到的类的异常。另外,上面的 AJAX 调用失败(未生成输出)

案例2:EAR 包含根目录下的所有应用程序 JAR 文件(MANIFEST.MF 具有手动指定的类路径)。
这种方法工作得很好,所有 JAR 文件都可以毫无问题地加载。此外,AJAX 调用也顺利进行。

任何想法为什么会发生这种情况。

- 阿什什

有帮助吗?

解决方案

是的,这是因为 Java EE 应用服务器有一个类加载器层次结构,如下所示:首先调用引导类加载器;接下来是 EAR 级别的类加载器,然后是 WAR 级别的类加载器。更高级别的类加载器不会在下面查找他们需要的类。如果他们找不到所需的内容,则会抛出 ClassNotFoundException。

因此 WEB-INF/lib 中的 JAR 对于 EAR 级别的类加载器来说是不可见的。当您将这些 JAR 向上移动时,问题就解决了。它使所有这些 JAR 对您的 EAR 中的所有 WAR 都可见。

您可能想要检查的一件事是 web.xml 和其他文件的规范。servlet 和 JSP 规范在此过程中发生了一些变化,因此像 JSTL 之类的 JAR 从版本 1.0 变为了 1.1。您可能需要仔细检查 web.xml 和所有 JAR,以确保它们符合 Java EE 应用服务器支持的规范。

不幸的是,升级应用程序服务器并不像放入 EAR 或 WAR 那么容易。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top