我在 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 是战争的一部分,战争是耳朵的一部分。耳朵里有所有的类,在一个罐子里。

关于预编译的愿望,如果系统认为jsp不需要编译,预编译会强制重新编译吗?看来并非如此。这里的错误不是编译错误,而是由于“更改”(在字节代码级别,而不是真正在代码级别)方法签名而导致的方法调用错误。

附录:请注意,我们最近在生产中经历过,即使设置了接受答案的标志,JSP 也不会重新编译,即使 JSP 实际上发生了更改。存在重大错误,但无论如何,JBoss 正常关闭。此时它已成为 JBoss 的旧版本,但如果您仍在使用它,删除 work 和 tmp 目录的内容是唯一可以确定的方法。

我不会仅仅因为它确实达到了问题所寻找的目的而更改已接受的答案。JBoss bug 是一个单独的问题。

有帮助吗?

解决方案

如果该JSP是一个战争是被部署为一个罐子的EAR的一部分的一部分,那么我不清楚为什么你的JSP没有被重新编译。不要把JSP的WAR文件中都小于从最终部署他们的JBoss编译的类文件更新的时间戳?如果不是这样,不能你触摸JSP作为在部署之前建设WAR / EAR的一部分。 [我指的是使用Unix“触摸”命令,而不是手动地互相接触JSP文件。]

另外,在$ JBOSS的DeleteWorkDirOnContextDestroy设置/服务器/ default / deploy目录/的jboss-web.deployer / META-INF /的jboss-service.xml的可能是你在找什么。它默认为false,但其设置为true可能是你所需要的。我想这应该删除重新部署JSP中类文件,使他们获得在每个JSP的第一次访问重建。

请参阅 https://jira.jboss.org/jira/browse/JBAS-3358 ,获取更多的信息。

其他提示

我不知道设置的,但在删除您的JBoss实例的工作目录下生成的Java类文件将导致JSP下一次它被称为重新编译。

您coudl改变JBoss的启动脚本明确删除“TMP”和/或“工作”的目录,其中编译的JSP存储。那么JBoss的将别无选择,只能重新编译他们。

不含蓄,但它会做的工作。

为你一个选择是预编译所有JSP的在编译时间。这会很快,举报任何编译错误。

您也可以做到这一点在生产 - 加快第一次访问,但我得到你想要这个更多的QA一步比什么都重要的感觉。如果是这样,你可以添加预编译步到您的测试阶段,您选择的构建工具 - 等你的CI环境。这将可保证该JSP不编译不会做出来的测试的。

上运行的预编译任务查看此详细信息:

的Jboss碧玉配置

希望这有助于。

一些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的

巴勃罗吉姆走在正确的道路上。您只需要更多信息即可全面了解正在发生的情况。我是这样理解的。

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

  1. 需要删除编译后的jsp版本。
  2. jsp本身需要修改(或者即使它被“触及”——修改日期也被更新)

如果您仍然需要验证所有 jsps 是否正常工作,那么它们都需要 使用 ant 任务预编译. 。这还允许您使用war文件中预编译的jsps来部署war文件。这应该可以解决你的问题。

如果您的文件不是以 war 文件部署,而是以分解格式部署,您应该 认真考虑打包您的网络应用程序 在用于部署的 war 文件中。这使得它成为在环境之间部署的一个很好的包。

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