7

我在 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 错误是一个单独的问题。

4

6 回答 6

11

如果 JSP 是作为 jar 部署的 EAR 的一部分的 WAR 的一部分,那么我不清楚为什么不重新编译您的 JSP。war 文件中的 JSP 的时间戳不是比上次部署时 JBoss 编译的类文件更新吗?如果不是,您不能在部署之前将 JSP 作为构建 WAR/EAR 的一部分来处理。[我指的是使用 Unix“触摸”命令,而不是手动触摸每个 JSP 文件。]

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

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

于 2009-06-12T01:27:59.773 回答
1

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

于 2009-06-04T21:18:19.143 回答
1

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

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

于 2009-06-07T15:07:54.490 回答
0

您的一种选择是在构建时预编译所有 jsp。这将快速标记任何编译错误。

您也可以在生产中执行此操作 - 加快首次访问,但我觉得您更希望在 QA 步骤中这样做。如果是这样,您可以将预编译步骤添加到您选择的构建工具中的测试阶段 - 以及您的 CI 环境中。这将确保不编译的 jsp 不会通过测试。

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

Jboss Jasper 配置

希望这可以帮助。

于 2009-06-09T08:31:28.273 回答
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

于 2009-06-10T11:33:45.193 回答
0

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

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

  1. jsp的编译版本需要删除。
  2. The jsp itself needs to be modified (or even if it's "touched" - modified date is updated)

If you still need to verify that all your jsps work, they will all need to be precompiled using an ant task. this also allows you to deploy the war file with the precompiled jsps in the war file. This should solve your problem.

If your files are not deployed in a war file, but in an exploded format, you should seriously consider packaging your web app in a war file for deployment. This makes it a nice package to deploy between environments.

于 2009-06-12T15:07:55.403 回答