jsp - tomcat 如何生成它的工作目录 *_jsp.java 文件,什么可能导致它生成零字节文件?

标签 jsp tomcat tomcat6 tomcat7

我的问题源于从 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/

相关文章:

java - 无法连接到 Tomcat 应用程序中的 Derby 数据库

java - 如何在套接字级别拦截 Tomcat 请求?

java - 即使在删除工作目录后,Tomcat 也会重新编译旧版本的 JSP

apache - 如何为 JSP 和 SEO 友好的干净 URL 设置 Apache 和 Tomcat

java - 访问请求范围的 bean

tomcat - 无法在vps上打开tomcat主页

tomcat - Apache Tomcat 6 启动问题

javascript - 用jsp更新数据库

eclipse - 将 WebDSL 应用程序部署到 Tomcat v6.0 时出现的问题

java - faces-config 导致启动 Web 应用程序时出现异常