jspc

已弃用

如果您将此任务与 Tomcat 的 Jasper JSP 编译器一起使用,您应该认真考虑使用 Tomcat 附带的任务。 此任务仅针对 Tomcat 4.x 进行测试。Tomcat 5.x 中存在已知问题,这些问题不会在 Ant 中修复,请改用 Tomcat 的 jspc 任务。
我们建议您不要依赖于特定于容器的 JSP 编译器,而是部署原始文件(*.jsp)并使用容器内置功能:部署后,针对已部署的 Web 应用程序运行测试套件(例如,使用 CactusHttpUnit)。这样,您将获得测试结果以及编译后的 JSP。

描述

Apache Ant 任务,用于运行 JSP 编译器并将 JSP 页面转换为 Java 源文件。

此任务可用于预编译 JSP 页面,以加快 JSP 页面的初始调用速度,在未安装完整 JDK 的服务器上进行部署,或者只是在不部署它们的情况下对页面进行语法检查。在大多数情况下,javac 任务通常是构建过程中的下一阶段。该任务执行基本的依赖项检查以防止不必要的重新编译 - 此检查比较源和目标时间戳,并且不考虑类或标签库依赖项或 <jsp:include> 引用。

默认情况下,该任务使用 Jasper JSP 编译器。这意味着该任务需要 jasper.jarjasper-runtime.jar,它们与来自 Apache Tomcat 项目 的 Tomcat 4/Catalina 版本一起提供,以及将来版本中可能需要的任何其他 jar 文件(它会发生变化)。

我们建议(在 2003 年 3 月)使用 Tomcat 4.1.x 版本,以获得最强大的 Jasper 版本。

此任务存在许多限制,部分原因是 Jasper 的多个版本,部分原因是任务中的实现“问题”(即,没有人愿意彻底更改它的很大一部分以解决 Jasper 的问题)。由于这一点以及 JSP 页面不必跨实现(或实现版本)可移植的事实,此任务更适合在部署之前验证 JSP 页面,而不是预编译它们。对于后者,只需部署并在部署后运行您的 HttpUnit JUnit 测试即可编译和测试您的页面,一次完成所有操作。

参数

该任务具有以下属性

属性 描述 必需
destdir 放置生成文件的目录。它们根据给定的包名位于此目录下。
srcdir 查找源 JSP 文件的位置。
verbose 要传递给编译器的详细程度整数。 否;默认值为 0
package 生成 Java 类的目标包的名称。
compiler JSP 编译器适配器的类名,例如 jasperjasper41 否;默认为 jasper
ieplugin Internet Explorer 的 Java 插件类 ID。
mapped (布尔值)为 JSP 中的每行 HTML 生成单独的 write() 调用。
classpath 用于运行 JSP 编译器的类路径。 否,但使用时似乎效果更好;也可以通过嵌套元素 classpath 指定
classpathref 一个 引用。与 classpath 相同。
failonerror 标志,用于控制编译失败时的操作。 否;默认值为 yes
uribase JSP 中相对 URI 引用 的上下文。 否;从文件相对于 uriroot 的声明或派生值的位置派生
uriroot 应解析 URI 的根目录。
compiler 要使用的 JSP 编译器适配器的类名。 否;默认为 Jasper 的标准适配器
compilerclasspath 用于查找由 compiler 属性指定的编译器适配器的类路径。
webinc 列出 servlet 的 web.xml 部分的输出文件名。
webxml 要生成的 web.xml 的文件名

如果 mapped 选项设置为 true,则会将 JSP 文本内容拆分为每行一个调用的格式。在映射的写入调用之上和之下有注释,以本地化 JSP 文件中每行文本来自的位置。这会导致性能略微下降(但它受线性复杂度的限制)。如果没有此选项,所有相邻的写入将被连接到单个写入中。

ieplugin 选项由 <jsp:plugin> 标签使用。如果您要使用的 Java 插件 COM 类 ID 发生更改,则可以在此处指定它。这应该不需要更改。

uriroot 指定 Web 应用程序的根目录。所有绝对 URI 将从此处解析。如果未指定,则将使用第一个 JSP 页面来派生它。为了派生它,将搜索第一个 JSP 页面的每个父目录以查找 WEB-INF 目录,并且将使用最靠近 JSP 页面的具有该目录的目录。如果找不到任何目录,则将使用调用 Jasperc 的目录。这仅影响从显式声明的 JSP 文件转换的页面 - 包括对标签库的引用。

uribase 用于建立 JSP 页面中相对 URI 引用 的上下文。如果它不存在,则从文件相对于 uriroot 的声明或派生值的位置派生。这仅影响从显式声明的 JSP 文件转换的页面。

作为嵌套元素指定的参数

此任务是一个 基于目录的任务,类似于 javac,因此要编译的 .jsp 文件与 javac 查找 .java 文件的方式相同。也就是说,includesexcludes 等元素可以直接在任务声明中使用。

特定于 jspc 任务的元素是

classpath

用于编译 JSP 页面的类路径,指定方式与任何其他类路径相同。

classpathref

对现有类路径的引用

webapp

指示 Jasper 构建整个 Web 应用程序。基目录必须在其下方具有 WEB-INF 子目录。使用时,该任务将所有依赖项检查移交给编译器。

属性 描述 必需
basedir Web 应用程序的基目录

示例

src/war 下的所有 .jsp 文件构建到目标 /gensrc 中,在以 com.i3sp.jsp 开头的包层次结构中。

<jspc srcdir="${basedir}/src/war"
      destdir="${basedir}/gensrc"
      package="com.i3sp.jsp"
      compiler="jasper41"
      verbose="9">
  <include name="**/*.jsp"/>
</jspc>

.jsp 文件生成 .java 文件,然后将它们使用 javac 编译为字节码。在 Java 编译中包含 lib/taglibs.jar。依赖项检查用于清除 .java 文件,如果类依赖项表明需要这样做。

<jspc destdir="interim"
      verbose="1"
      srcdir="src"
      compiler="jasper41"
      package="com.i3sp.jsp">
  <include name="**/*.jsp"/>
</jspc>
<depend srcdir="interim"
         destdir="build"
         cache="build/dependencies"
         classpath="lib/taglibs.jar"/>
<javac srcdir="interim"
         destdir="build"
         classpath="lib/taglibs.jar"
         debug="on"/>

注释

使用 package 属性,可以识别生成的 .java 文件,从而进行完整的依赖项检查 - 此任务仅在 .jsp 文件被修改时才应重建 .java 文件。但是,这仅适用于某些版本的 Jasper。默认情况下,检查支持使用 jasper 编译器的 Tomcat 4.0.x,对于 Tomcat 4.1.x 依赖项检查,将编译器设置为 jasper41。即使它确实有效,.tld 导入或编译时包含的更改也不会被拾取。

Jasper 根据 JSP 1.2 规范生成 JSP 页面 - 类路径上需要 servlet 规范的 2.3 版本的副本才能编译 Java 代码。