代码之家  ›  专栏  ›  技术社区  ›  Yishai

如何在JBoss4.2中强制重新编译JSP?

  •  7
  • Yishai  · 技术社区  · 15 年前

    我在qa的jboss 4.2上碰到了这种令人讨厌的行为,我想在我们投入生产并找到其他的角落案例之前把它扼杀在萌芽状态。

    JSP调用具有以下签名的方法:

     public void methodName(String arg)
    

    更改为:

     public void methodName(String arg, Object... args)
    

    预先存在的JSP通过以下方式调用了此方法:

     methodName("param");
    

    在部署修改后的代码时,JBoss没有重新编译JSP,这导致了QA中的崩溃。向JSP添加一个愚蠢的注释修复了这个问题(JBoss认识到JSP已经更改并重新编译了它)。

    jboss上是否有在重启时强制重新编译jsp的设置?

    编辑:为了澄清答案中的一些要点,设置是JSP是战争的一部分,这是EAR的一部分。耳朵里有所有的类,在一个罐子里。

    关于预编译的愿望,如果系统认为JSP不需要编译,预编译会强制重新编译吗?似乎不是这样。这里的错误不是一个关联错误,它是一个方法调用错误,因为“changed”(在字节代码级别,实际上不是在代码级别)方法签名。

    附录:请注意,我们最近在生产中遇到过这样的情况:即使设置了接受答案的标志,JSP也不会重新编译,即使JSP实际上发生了变化。但不管怎样,jboss正常关闭。此时,它将成为JBoss的旧版本,但如果您仍在使用它,删除工作和tmp目录的内容是唯一可以确定的方法。

    我并不是简单地改变被接受的答案,因为它真正达到了问题所要寻找的目的。JBoss错误是一个独立的问题。

    6 回复  |  直到 14 年前
        1
  •  11
  •   Yishai    14 年前

    如果JSP是作为JAR部署的EAR的一部分,那么我不清楚为什么没有重新编译JSP。war文件中的jsp是否比上次部署时jboss编译的类文件有更新的时间戳?如果没有,在部署之前,您不能触摸JSP作为构建war/ear的一部分吗?[我指的是使用unix“touch”命令,而不是手动触摸每个JSP文件。]

    或者,$jboss/server/default/deploy/jboss-web.deployer/meta-inf/jboss-service.xml中的deleteWorkDironContextDestroy设置可能是您要查找的内容。默认情况下它是错误的,但将其设置为真可能是您需要的。我认为这应该在重新部署时删除JSP的类文件,以便在首次访问每个JSP时重新创建它们。

    https://jira.jboss.org/jira/browse/JBAS-3358 更多信息。

        2
  •  1
  •   Mr. Will    15 年前

    我不知道设置,但是在JBASS实例的工作目录中删除生成的Java类文件将导致JSP下次调用它时被重新编译。

        3
  •  1
  •   skaffman    15 年前

    您可以修改jboss启动脚本来显式删除存储编译的JSP的“tmp”和/或“work”目录。JBoss将别无选择,只能重新编译它们。

    不是很微妙,但它会起作用。

        4
  •  0
  •   Pablojim    15 年前

    您可以选择在构建时预编译所有JSP。这将很快标记所有编译错误。

    你也可以在生产中这样做-加速第一次访问,但我感觉你更希望这是一个质量保证步骤,而不是任何其他。如果是这样,您可以将预编译步骤添加到您选择的构建工具中的测试阶段,也可以添加到您的CI环境中。这将保证不编译的JSP不会脱离测试。

    有关运行预编译任务的详细信息,请参阅此部分:

    Jboss Jasper configuration

    希望这有帮助。

        5
  •  0
  •   RealHowTo    15 年前

    一些JSP容器(根据JSP 1.2规范的第8.4.2节)支持预编译JSP页面的功能。

    要预编译JSP页,请使用查询字符串访问该页。JSPX预编译

    http://hostname.com/mywebapp/mypage.jsp?jsp_precompile
    

    不会执行JSP页。如果容器支持预编译,则在必要时将编译JSP页。

    也见 http://www.rgagnon.com/javadetails/java-0414.html

        6
  •  0
  •   Mike Pone    15 年前

    帕布罗吉姆走对了。你只需要更多的信息就能全面了解正在发生的事情。我就是这样理解的。

    在prod中,您更改了一个JSP,它需要重新编译其他JSP。为了重新编译它们,必须发生两件事之一

    1. 需要删除JSP的编译版本。
    2. JSP本身需要修改(或者即使它被“触摸”-修改日期被更新)

    如果您仍然需要验证所有JSP的工作,那么它们都需要 precompiled using an ant task . 这还允许您在war文件中使用预编译的JSP部署war文件。这应该能解决你的问题。

    如果您的文件不是以战争文件部署的,而是以分解格式部署的,那么您应该 seriously consider packaging your web app 在用于部署的战争文件中。这使得它成为在环境之间部署的一个很好的包。

    推荐文章