2009-04-29 36 views
1

我们目前正在将我们的应用程序从生产环境迁移到全新的数据中心。 JavaEE 5,WAS 6.0 JSP的奇怪问题包括

  • 当前生产环境: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下)。这是行不通的,我们希望获得classloader找不到的类的异常。另外,上面的AJAX调用失败(未生成输出)

情况2:EAR包含根上的所有应用程序JAR文件(MANIFEST.MF具有手动指定的类路径)。
这种方法可以很好地工作,所有的JAR文件都没有任何问题。而且,AJAX调用也很好。

任何想法,为什么这可能会发生。

- 阿希什

回答

1

是的,这是因为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那样容易。