我的问题源于从 Tomcat 6.0.18 升级到 7.0.22,尽管该问题似乎可能出现在其他版本中。我怀疑这源于我对 Tomcat 核心行为的误解,尽管在搜索了 Tomcat documentation 之后,以前关于 Tomcat 的 SO 问题(太多而无法有效引用),以及来自各种来源的各种博客文章(再次没有足够的主题值得引用),我不知所措。
我正在使用的应用程序是一个庞大的 Java 应用程序,包含数百个 JSP 页面。过去,在 Tomcat 6 上,我们在运行时编译它们没有任何问题。它们(大部分)在 Tomcat 的工作目录中正确生成 *_jsp.java
文件,并且编译成 *.class 文件按预期工作。那些不是的是生产设置中未使用的遗留代码,由于不值得在此指定的原因仍在代码库中。
当迁移到 Tomcat 7,特别是 7.0.22 时,我遇到了意外行为。绝大多数 JSP 页面编译(包括 .java
代码及其附属的 .class
文件)都可以很好地编译到工作目录中。但是,有些会生成 0 字节的 .java
文件。
我对这个问题的第一个看法是:“关于 Tomcat JSP 编译的一些东西在两个版本之间发生了变化,除了 JSP 规范本身。”在四处寻找之后in the docs ,似乎没有什么明显的,所以我 attempted to pre-compile all the jsps using Ant .
就转换为 .java 文件而言,这是成功的,使用了一个非常简单的 ant 脚本:
<project name="myApp" default="all" basedir=".">
<import file="${tomcat.home}/bin/catalina-tasks.xml"/>
<target name="jspc">
<jasper
validateXml="false"
uriroot="${webapp.home}"
webXmlFragment="${webapp.home}/WEB-INF/generated_web.xml"
outputDir="${webapp.home}/WEB-INF/classes"
failonerror="false" />
</target>
<target name="all" depends="jspc">
</target>
</project>
*_jsp.java
文件由 jasper 正确生成,以及Tomcat编译到工作目录时出现问题的0字节文件,使用该方法编译正常。与 Tomcat 6 的工作目录 *_jsp.java
文件相比,存在一些细微差别,但它们似乎与 JSP spec version upgrade between 6 and 7 有关。 .不幸的是,我们的遗留代码使得一些生成的 .java
文件在两个版本中通常都无法编译。使它们从 .java
编译为 .class
(相对于 .jsp
到 *_jsp.java
到 *_jsp.class
) 将需要深度重构。因此,我无法追求真正的 JSP 预编译策略。 Tomcat 似乎比我的脚本更智能地处理这些文件,这不足为奇。
那么,我的问题有点宽泛:什么可能导致 tomcat 在其工作目录中生成空的 *_jsp.java
文件?作为推论,Tomcat 通过什么过程在其工作目录中生成这些文件,这与我可能使用 Ant 脚本生成这些文件的方式有何不同?我怀疑对 Tomcat 的核心行为的更深入理解可能会产生一个明显的解决方案,一个可解释的问题,或者至少是一个像“这是设计好的。请重构。”这样的答案。
最佳答案
我们有一个类似的问题,并在我们的上下文中找到了原因:我们在 tomcat 启动后立即在我们的持续集成环境中运行 selenium 测试,因此部署尚未完成,并且不知何故产生了 0 长度(空) *jsp.java 和 *jsp.class 文件。 有趣的是,所有构建都会发生这种情况,因为部署总是比开始运行测试花费的时间更长(大约 1 米)。
我们通过引入延迟来修复它,以允许内部 tomcat 部署程序完成其工作。
关于jsp - tomcat 如何生成它的工作目录 *_jsp.java 文件,什么可能导致它生成零字节文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8813509/