如果您将此任务与 Tomcat 的 Jasper JSP 编译器一起使用,您应该认真考虑使用 Tomcat 附带的任务。 此任务仅针对 Tomcat 4.x 进行测试。Tomcat 5.x 中存在已知问题,这些问题不会在 Ant 中修复,请改用 Tomcat 的 jspc
任务。
我们建议您不要依赖于特定于容器的 JSP 编译器,而是部署原始文件(*.jsp)并使用容器内置功能:部署后,针对已部署的 Web 应用程序运行测试套件(例如,使用 Cactus 或 HttpUnit)。这样,您将获得测试结果以及编译后的 JSP。
Apache Ant 任务,用于运行 JSP 编译器并将 JSP 页面转换为 Java 源文件。
此任务可用于预编译 JSP 页面,以加快 JSP 页面的初始调用速度,在未安装完整 JDK 的服务器上进行部署,或者只是在不部署它们的情况下对页面进行语法检查。在大多数情况下,javac
任务通常是构建过程中的下一阶段。该任务执行基本的依赖项检查以防止不必要的重新编译 - 此检查比较源和目标时间戳,并且不考虑类或标签库依赖项或 <jsp:include>
引用。
默认情况下,该任务使用 Jasper JSP 编译器。这意味着该任务需要 jasper.jar 和 jasper-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 编译器适配器的类名,例如 jasper或 jasper41 |
否;默认为 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 文件的方式相同。也就是说,includes
和 excludes
等元素可以直接在任务声明中使用。
特定于 jspc
任务的元素是
用于编译 JSP 页面的类路径,指定方式与任何其他类路径相同。
对现有类路径的引用
指示 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 代码。