2009-06-04 77 views
7

我在QA中对JBoss 4.2上的这种讨厌的行为感到懊恼,并且在我们投入生产并找到其他一些角落案例之前,我想将它扼杀在萌芽状态。如何强制在JBoss 4.2中重新编译jsps?

一个jsp卡列斯其具有以下特征的方法:

public void methodName(String arg) 

这变为:

methodName("param"); 

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

A-预先存在的JSP通过调用此方法

在部署修改后的代码时,JBoss没有重新编译JSP,导致QA崩溃。给jsp添加一个愚蠢的评论解决了这个问题(JBoss认识到JSP改变并重新编译了它)。

在JBoss上有一个强制重新编译JSP的设置吗?

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

关于预编译的愿望,如果系统不认为jsp需要编译,会不会预编译强制重编译?它似乎并不如此。这里的错误不是一个compliation错误,它是一个方法调用错误,因为“已更改”(在字节码级别,而不是在代码级别)方法签名。

附录:请注意,尽管JSP确实发生了更改,但即使使用接受的答案标志集,JSP也不会重新编译,但我们最近在生产中经历过。那里存在主要的bug,但是无论如何,JBoss正常关闭。此时它将成为旧版本的JBoss,但如果您仍在使用它,删除工作内容和tmp目录是唯一可行的方法。

我并没有改变接受的答案,仅仅是因为它真的到了问题所在的地步。 JBoss的错误是一个单独的问题。

回答

11

如果JSP是一个战争是被部署为一个罐子的EAR的一部分的一部分,那么我不清楚为什么你的JSP没有被重新编译。战争文件中的JSP不是比上次部署中的JBoss编译的类文件具有更新的时间戳吗?如果不是,那么在部署之前是否可以将JSP作为构建WAR/EAR的一部分来使用? [我指的是使用Unix“touch”命令,而不是手动触摸每个JSP文件。]

或者,$ JBOSS/server/default/deploy/jboss-web.deployer/META-INF中的DeleteWorkDirOnContextDestroy设置/jboss-service.xml可能是你正在寻找的。它默认为false,但将其设置为true可能是您需要的。我认为这应该在重新部署时删除JSP的类文件,以便在首次访问每个JSP时重新创建它们。

有关更多信息,请参阅https://jira.jboss.org/jira/browse/JBAS-3358

1

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

+1

谢谢,但在生产部署期间实际上很难做到这一点。 – Yishai 2009-06-04 21:46:44

1

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

不是微妙的,但它会做的工作。

0

你的一个选择是在构建时预编译所有的jsp。这会很快标记任何编译错误。

你也可以在生产中做到这一点 - 加速第一次访问,但我觉得你希望这更多的QA步骤比其他任何事情。如果是这样,您可以将预编译步骤添加到您选择的构建工具中的测试阶段 - 也就是您的CI环境。这将保证不编译的jsp不会使其脱离测试。

上运行的预编译任务的详细信息请参见本:

Jboss Jasper configuration

希望这有助于。

+0

谢谢,我们确实这样做。问题是构建脚本符合干净,并且在干净的编译中,该示例没有问题。这里的问题是底层的JSP需要重新编译才能工作,即使它没有改变,重新编译也可以工作,但是如果没有重新编译,JSP将无法正常工作。 – Yishai 2009-06-09 13:29:54

+0

足够公平,它不会在构建上发现此错误。您是否考虑过预编译生产? – Pablojim 2009-06-09 14:19:02

+0

你如何预编译生产(你使用什么设置)?它会重新编译一切吗? – Yishai 2009-06-09 19:14:52

0

某些JSP容器(按照JSP 1.2规范的8.4.2节)支持预编译JSP页面的能力。

要预编译JSP页面,用的查询字符串访问该网页?jsp_precompile

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

JSP页面将不会被执行。如果容器支持预编译,那么将根据需要编译JSP页面。

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

0

Pablojim在正确的轨道上。你只需要一些更多的信息来了解发生了什么。这是我的理解。

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

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

如果您还需要验证所有JSP中工作,他们都需要是precompiled using an ant task。这也允许你在war文件中部署带有预编译jsps的war文件。这应该可以解决你的问题。

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