调试“预编译的 JSP 被重新编译”

问题描述
客户使用 weblogic.jspc 将预编译的 JSP 类打包成 WAR 文件或分发形式的 webapp,然后部署到 Weblogic Server。在访问这些 JSP 时出现意外情况:系统对这些 JSP 进行了重新编译。 

故障排除
请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。

快速链接>
为什么发生此问题?   
  如果 WLS 与编译器的版本(Service Pack、补丁、类路径)有差异、时间戳不正确或打包无效,通常会出现此问题。 

WLS 执行以下决策流程来确定是否进行编译:



返回页首

故障排除步骤

第一步是仔细查看打包预编译 JSP 时的检查清单:

 
  1. webapp(在 EAR 内,或为独立形式)必须包含 WEB-INF/classes/jsp_servlet/ 目录(“jsp_servlet”为缺省包名称)下的 JSP 编译类。例如:
 

WEB-INF/classes/jsp_servlet/__compiledJSP1.class

WEB-INF/classes/jsp_servlet/__compiledJSP2.class

WEB-INF/web.xml

WEB-INF/weblogic.xml

考虑事项:

  1. 如果您运行 weblogic.jspc,且预编译类已经就位,ChangeawareClassloader 就会将这些类位置加载到缓存中(因为 Classfinder 的性能开销惊人!)。如果预编译类的数量达数千,就可能导致 OutOfMemoryError。一种解决方法是增大 -XX:MaxPermSize 值。
  2. 如果使用 JSP 编译器选项更改了包名称:

-package packageName

则必须相应更新 weblogic.xml 文件:

<weblogic-web-app>

...

<jsp-descriptor>

...

<jsp-param>

<

<param-name>packagePrefix</param-name>

<param-value>packageName</param-value>

</jsp-param>

...

</jsp-descriptor>

...

</weblogic-web-app>

  1. 确保域目录下的 setEnv 脚本(或正在使用的 ANT build.xml)与您将要使用的 startWeblogic 脚本的类路径相同。例如,您的服务器中包含的所有 BEA 补丁都必须出现在 setEnv 脚本中,而且顺序必须相同。新补丁可能包含旧补丁内相同类的新版本,因此要确保先加载最新版本的类以按正确的次序执行,顺序就显得非常重要。
 
setEnv 脚本:

CLASSPATH = /bea/weblogic81/server/lib/CR124xx1_81xx.jar:
/bea/weblogic81/server/lib/CR124xx2_81xx.jar:
/bea/jdk141_05/lib/tools.jar:/bea/weblogic81/server/lib/weblogic_sp.jar:
/bea/weblogic81/server/lib/weblogic.jar

startWeblogic:
java.class.path

= /bea/weblogic81/server/lib/CR124xx1_81xx.jar:
/bea/weblogic81/server/lib/CR124xx2_81xx.jar:
/bea/jdk141_05/lib/tools.jar:/bea/weblogic81/server/lib/weblogic_sp.jar:
/bea/weblogic81/server/lib/weblogic.jar

 

  1. 调用 setEnv,然后调用 JSP 编译器:
  2. %JAVA_HOME%\bin\java weblogic.jspc -classpath %CLASSPATH% -d build\WEB-INF\classes -verbose -keepgenerated *.jsp


    备注:使用 JSP compiler tool (English) 时,请确保它的编译环境与部署 webapp 的环境完全相同。例如:

  1. 如果使用的是 WLS 6.1 SP3 编译器(可使用 java weblogic.jspc -version 来检查它的版本),则部署环境也必须是 WLS 6.1 SP3 环境。如果 Weblogic Server 检测到这些 JSP 是为另一版本的服务器而编译的,就会对它们进行重新编译,因为 WLS 并不检查 .class 文件是否兼容。如果不兼容,就可能出现运行时错误。
  2. 如果您在不区分大小写的环境(如 Windows)中对 JSP 进行预编译,并想将它们部署到一个区分大小写的环境(如 UNIX),则必须使用以下选项对这些 JSP 进行预编译:

 -Dweblogic.jsp.windows.caseSensitive=true

用法:java -Dweblogic.jsp.windows.caseSensitive=true weblogic.jspc -webapp mywebapp -d mywebapp\WEB-INF\classes

如果您想让 WLS 在 Windows 上运行时具有这些预编译 JSP,则必须使用上述选项启动 WLS。

返回页首


如果在检查所有上述步骤后,JSP 仍然会被重新编译,请检查以下可能存在的情况。可能会出现以下几种难解的情况,而这些情况就可能是该故障的成因:

    1. weblogic.jspc 的类路径仍然与用于部署 JSP 的 WLS 实例的类路径不同。例如,尽管脚本中列有某个补丁文件,但实际上 weblogic.jspc 的类路径或 WLS 实例的类路径中并没有该文件。如果在 Ant 脚本内使用 JSP 编译器时出现这种情况,就更令人费解。

      此时可循常理进行一项检查,即利用几条 echo 语句捕捉调用 JSP 编译器前类路径的快照,并将该类路径与 Weblogic 服务器的类路径进行比较。

    2. 系统编译 JSP,随后将其复制到 WAR 的根目录中。尽管这两个事件在生成脚本内的发生过程只有几毫秒,但它们确实会引发故障,因为复制的 JSP 的时间戳要比编译类的时间戳晚(即便只是晚几毫秒),而这正是 WLS 后来要对其进行重新编译的原因。为确保不出现这种情况,应先将 JSP 复制到 webapp 的根目录,然后只使用这些副本来调用 weblogic.jspc 实用程序。

    3. 1.5.2+ 版本有一个 ANT 错误(请参阅 http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17934),该错误会强制 Weblogic Server 重新编译某些 JSP。仅在一种情况下会出现此故障,即使用 ANT 将 webapp(wlpackage 任务)打包为 WAR 文件时。具有奇数时间戳的所有 JSP 均会被上舍入为下一秒数。WLS 会按常理认为它们是修改过的 JSP,因而会对它们进行重新编译。1.6 版已修复了这个 ANT 错误。 

      解决方法

      1. 使用最新版本的 ANT(或使用更早的 ANT 1.5.1)
      2. 打包 webapp 时,请使用“JAR -cvf”来代替 ANT wlpackage 任务
      ?
    4. 如果在进行了上述检查后仍未奏效,请使用技术支持工程师在 dev2dev.bea.com 提供的 JSP compilation checkers (English) 工具,网站上列出的该工具的名称是:
    1. JSP Precompile Validation Utility
    2. JSP Precompilation Test Utility

    >以下是 JSP Precompilation Test Utility 输出内容的一个示例:

     


***********************************
*** compiledwith61/SimpleSession.jsp
***********************************
JSP Path: compiledwith61/SimpleSession.jsp
JSP modified date:    Wed Jan 15 12:01:26 CET 2003
JSP compilation date: Wed Jan 15 12:01:26 CET 2003
Generated class name: __SimpleSession.class
Generated class path: WEB-INF/classes/jsp_servlet/_compiledwith61
Compilation date of JSP is actual.
RESULT: This JSP is correctly precompiled for WLS WebLogic Temporary Patch for CR081194 07/18/2002 03:42:30 on case
sensitive environments (e.g. UNIX).

***********************************
*** compiledwith70lower/test_modified.jsp
***********************************
JSP Path: compiledwith70lower/test_modified.jsp
JSP modified date:    Wed Dec 03 09:16:32 CET 2003
JSP compilation date: Thu Jun 12 09:47:26 CEST 2003
Generated class name: __test_modified.class
Generated class path: WEB-INF/classes/jsp_servlet/_compiledwith70lower
Compilation date of JSP is NOT actual.
RESULT: This JSP has to be recompiled, JSP modification date is more recent than compilation date.


***********************************
*** PRECOMPILATION TEST RESULTS ***
***********************************
Number of JSPs in Webapp:                                                 2
*** WARNING: Different WLS versions used for precompilation! ***
*** Please use '-verbose' option for more details.           ***

PRECOMPILATION WORKING:
Prec. JSPs for case sensitive environments (e.g. UNIX):                   1
Prec. JSPs for not case sensitive environments (e.g. WINDOWS):            0
Prec. JSPs for all environments (e.g. WINDOWS or UNIX):                   0

PRECOMPILATION NOT WORKING:
NOT Precompiled JSPs:                                                     0
Prec. JSPs, but modified date of JSP is more recent than generated class: 1
*** Please verify to have set the identical timezone as on the precompilation machine! ***
*** For Example: TZ=MET (Linux)  





返回页首其它资源
  
技术支持工程师在 dev2dev.bea.com 上提供的 JSP compilation checkers (English),网站上列出的该工具的名称是:

  1. JSP Precompile Validation Utility
  2. JSP Precompilation Test Utility

???

返回页首

需要更多帮助?
如果您已经理解这个模式,但仍需要更多帮助,您可以:

  1. http://support.bea.com/ 上查询 AskBEA(例如,使用“recompiling precompiled JSPs”),以查找其它已发布的解决办法。
  2. http://newsgroups.bea.com/ 上,向 BEA 的某个新闻组提出更详细具体的问题。
如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support.bea.com/

反馈

请给我们提供您的意见,说明此支持诊断模式“调试‘预编译的 JSP 被重新编译’”一文是否有所帮助、您需要的任何解释,以及对支持诊断模式的新主题的任何要求。


免责声明:

依据 BEA 与您签署的维护和支持协议条款,BEA Systems, Inc. 在本网站上提供技术技巧和补丁供您使用。虽然您可以将这些信息和代码与您获得 BEA 授权的软件一起使用,但 BEA 并不对所提供的技术技巧和补丁做任何形式的担保,无论是明确的还是隐含的。

本文档中引用的任何商标是其各自所有者的财产。有关完整的商标信息,请参考您的产品手册。

返回页首