级别: 初级 Scott Johnson (scottjoh@us.ibm.com), IBM WebSphere Application Server Development, IBM
2004 年 2 月 01 日 本文是一个分为三部分的系列文章的第一篇,它描述批处理编译器的一些内部操作,并探讨了 WebSphere Application Server Technology for Developers V6.0 中提供的批处理编译器配置参数。另外两部分也将焦点放在 WebSphere Application Server V6.0 TD 上,其中第 2 部分将讨论 JSP Engine 的性能调优,而第 3 部分将探讨 JavaServer Pages Engine 的体系结构。
本文是一个分为三部分的系列文章的第一篇,它描述批处理编译器的一些内部操作,并探讨了 WebSphere Application Server Technology for Developers V6.0 中提供的批处理编译器配置参数。另外两部分也将焦点放在 WebSphere Application Server V6.0 TD 上,其中第 2 部分将讨论 JSP Engine 的性能调优,而第 3 部分将探讨 JavaServer Pages Engine 的体系结构。
简介
JavaServer Pages (JSP) 可以在 Web 应用程序开发之际、应用程序部署之前进行编译。在一个预先部署的应用程序中对 JSP 进行批处理编译,可以简化部署过程。由于消除了第一次请求(first-request)编译,因而又提高了 JSP 的运行时性能。批处理编译器还可以对那些已部署到 IBM WebSphere Application Server 中的企业应用程序进行操作。
本文将描述批处理编译器的一些内部操作,并且还将探讨 WebSphere Application Server Version 6.0 TD 中可用的所有批处理编译器配置参数。本系列文章的第 2 部分和第 3 部分将分别讨论 WebSphere Application Server Technology for Developers V6.0 TD 中 JSP Engine 的性能调优和探讨 JavaServer Pages Engine 的体系结构。
批处理编译器操作
批处理编译器验证 JSP 的语法,将 JSP 翻译成 Java 源文件,并把 Java 源文件编译成 Java Servlet 类文件。同样,它还验证 Tag 文件并生成它们的 Java 实现类。
批处理编译器有很多配置参数,这使得应用程序开发人员或部署人员能够控制其行为(请参阅
批处理编译器配置参数)。虽然配置批处理编译器的方式有很多种,但是只有一个必需的配置参数:批处理编译器
target。该配置参数的缺省值在大多数情况下都很合适,这也使得这种工具易于使用。
受支持的 JSP 和 servlet 规范
批处理编译器可以对支持 Servlet 2.4 规范(或者 Servlet 2.2 这样的早期规范)的 Web 模块进行操作。它可以对按照 JSP 2.0 规范(或者 JSP 1.0 这样的早期规范)编写的 JSP 进行操作。批处理编译器能够识别 Servlet 2.4 (JSP 2.0) 部署描述符(web.xml),并且可以使用它所能包含的任何 jsp-config 元素。在 Servlet 2.3 (JSP 1.2) 或 Servlet 2.2 (JSP 1.1) 部署描述符中,批处理编译器可以识别和使用该描述符可能包含的任何 taglib 元素。
批处理编译器目标
可以对压缩的或展开的企业应用程序归档(Enterprise Application Archives,EAR)和 Web 应用程序归档(Web Application Archives,WAR),以及已经部署到 WebSphere Application Server 中的企业应用程序和 Web 模块执行批处理编译器。如果目标是一个已部署的企业应用程序,无需运行服务器就可以执行批处理编译器。如果在目标服务器正在运行时执行批处理编译器,那么除非重新启动企业应用程序,否则服务器将不知道经过更新的类文件,也不会装载那个类文件。如果目标是一个压缩的 EAR 或 WAR,批处理编译器就必须首先扩展它,然后再执行。
表 3描述了批处理编译器展开 EAR 和 WAR 的情景。
对 Web 模块的处理
批处理编译器一次只对一个 Web 模块进行操作。如果目标是一个 EAR,或者是一个已安装的、包含不止一个 Web 模块的企业应用程序,那么批处理编译器就会逐个地对每个 Web 模块进行操作。这是因为 JSP 是按照 Web 模块并通过 Web 模块的
web.xml 部署描述符来配置的。
在一个 Web 模块内,批处理编译器一次处理一个目录。它逐个地验证和翻译每个 JSP,然后为那个目录中生成的整组 Java 源文件调用 Java 编译器。如果在 Java 编译阶段有一个 JSP 文件编译失败,则 Java 编译器可能不会为那个目录中成功通过编译的大部分或所有 JSP 创建类文件。
JSP 文件扩展名
批处理编译器通过 4 种情况来判断它该处理什么样的文件扩展名:
- 标准 JSP 文件扩展名
- Servlet 2.4 Web 模块内部署描述符中 jsp-property-group 元素的 url-pattern 属性。
- jsp.file.extensions JSP Engine 配置参数(用于 pre-Servlet 2.4 Web 模块)。
- 批处理编译器 配置参数 jsp.file.extensions。
批处理编译器总是使用标准扩展名。如果 Web 模块包含 Servlet 2.4 部署描述符,则批处理编译器还将处理 jsp-config 元素中出现的任何 url-pattern。如果批处理编译器目标包含 JSP Engine 配置参数 jsp.file.extensions,则那些扩展名也将得到处理。如果提供了批处理编译器配置参数 jsp.file.extensions,那么批处理编译器还将处理这里给出的扩展名,并重写 JSP Engine 配置参数 jsp.file.extensions。
为 JSP “片段(fragment)”提供一个批处理编译器不进行处理的扩展名,这是一个很好的方法。对于那些将来不会单独使用的静态包含的(Statically-included)片段,处理它们时将会生成翻译或编译错误。对于这一类的文件,JSP 2.0 规范建议使用扩展名
.jspf 。
JSP Engine 配置参数
批处理编译器有 9 个配置参数,在 WebSphere Application Server JSP Engine 中可以找到与它们等效的参数。如果给出了 JSP Engine 参数,那么在等效的批处理编译器参数没有给出的时候,这些 JSP Engine 参数就充当缺省参数。(请参阅
三组配置参数以及它们的优先级)。这些参数是:
表 1. 批处理编译器参数和等效的 JSP Engine 参数
批处理编译器
配置参数
|
JSP Engine
配置参数
|
-keepgenerated
|
keepgenerated
|
-verbose
|
verbose
|
-deprecation
|
deprecation
|
-compileWithAssert
|
compileWithAssert
|
-trackDependencies
|
trackDependencies
|
-usePageTagPool
|
usePageTagPool
|
-useThreadTagPool
|
useThreadTagPool
|
-useJikes
|
useJikes
|
-jsp.file.extensions
|
jsp.file.extensions
|
批处理编译器不会创建 JSP Engine 参数,或者设置这些参数的值。这意味着如果对一个已部署的 Web 模块中的某个 JSP 作了修改,并且在运行时由 JSP Engine 对其重新编译,则 JSP Engine 的配置参数将决定引擎的行为。如果在已部署的 Web 模块中预先编译好的 JSP 永不会修改,那么这就无关紧要了。如果在已部署的 Web 模块中对它们作了修改,那么引擎的参数应该设置为批处理编译时用到的同一值。
判断何时需要编译 JSP
如果 JSP 的类文件的时间戳不同于 -- 迟于或早于 -- JSP 的时间戳,那么就认为该类文件已过期。如果类文件已过期,或者类文件不存在,批处理编译器将翻译和编译 JSP。(即使 JSP 的类文件已过期,还是可以用 JSP Engine 配置参数来禁用 JSP 的运行时编译。请参阅
JSP Engine 性能考虑。)
一个 JSP 可能存在某些附属文件(请参阅
trackDependencies)。如果 trackDependencies 配置参数被设置为 true,并且在最近一次翻译和编译了一个 JSP 之后修改了该 JSP 任意一个附属文件的时间戳,那么就会重新生成一个 JSP 类文件。JSP 的附属文件的名称和时间戳存储在类文件中,这样批处理编译器(以及在运行时的 JSP Engine)就可以判断是否有附属文件曾被修改。
通过使用参数 forceCompilation,可以强制用批处理编译器对 JSP 进行编译 -- 不管类文件是否过期,也不管是否有附属文件被修改(请参阅
可选的配置参数)。
决定在哪里生成类文件
在运行时,WebSphere Application Server JSP Engine 将从 WebSphere Application Server 临时目录或者 Web 模块的
WEB-INF/classes 目录装载 JSP 类文件。WebSphere Application Server 临时目录通常是
{WAS_ROOT}/temp 。WebSphere Application Server JSP Engine 首先在临时目录中搜索类文件,如果没有搜索到,便再到 Web 模块的
WEB-INF/classes 目录中去搜索。图 1 显示了 JSP Engine 在运行时的处理逻辑。
批处理编译器同时支持在 WebSphere Application Server 临时目录和在 Web 模块的
WEB-INF/classes 目录中生成类文件,具体在哪个目录中要取决于批处理编译器目标的类型。此外,批处理编译器还支持将类文件生成到文件系统上目标应用程序以外的任何目录中。请参阅
表 4以了解详情。
将类文件生成到一个 Web 模块的
WEB-INF/classes 目录中,这样可以将此 Web 模块部署为一个自包含 WAR 或者一个 EAR 内的 WAR。
图 1. JSP Engine 在哪里寻找 JSP 类文件
批处理编译器类路径
批处理编译器像表 2 所示的那样建立其类路径。当批处理编译器目标是一个 WAR 时(提供
war.path ),可以用配置参数 additional.classpath 来给出额外的类路径信息。
表 2. 批处理编译器类路径
|
添加到类路径的位置
|
批处理编译器目标
| |
enterpriseapp.name
|
ear.path
|
war.path
| | WebSphere Application Server JAR 和类 | 是 | 是 | 是 | | 在 Web 模块的清单类路径中列出的 JAR | 是 | 是 | 如果目标 WAR 在一个 EAR 内,并且没有使用 -extractToDir,则是;反之则否 | | 共享库 | 是 | 否 | 否 | | Web 模块 JAR 和类 | 是 | 是 | 是 | | 批处理编译器的 additional.classpath 参数 | 否 | 否 | 是 |
记录
批处理编译器会将其操作记录到控制台和一个日志文件
{WAS_ROOT}/logs/jspBatchCompilerTrace.log 。缺省的记录级别是 CONFIG,在此级别将记录处理信息和任何异常,或者碰到的 JSP 翻译或编译错误。如果为了便于调试,需要更细的记录级别,那么可以使用 log.level 参数(请参阅
log.level)。
JSP Engine 性能考虑
JSP Engine 提供了一个配置参数 disableJspRuntimeCompilation,该参数可以禁用 JSP 的运行时编译。对于该引擎来说,这是最有效的一种模式,因为它再也不用检查类文件是否过期,从而避免了所有的文件系统检查。这种设置要求提供 JSP 的类文件,即使是第一次请求亦需如此。要想使用这个参数,在部署应用程序时,所有的 JSP 类文件都必须存在。在应用程序装配的最后阶段,可以使用批处理编译器参数 forceCompilation 来确保在部署之前所有的 JSP 类文件都已存在。
如果在运行时修改了 JSP,需要重新装载这些 JSP 以便使修改生效,那么可以使用 JSP Engine 参数 reloadEnabled 和 reloadInterval。reloadEnabled 参数决定了如果 JSP 文件或者其附属文件(请参阅
trackDependencies)被修改,是否要在运行时重新翻译和重新编译该 JSP 文件。注意,如果 reloadEnabled 为 false(缺省值),除非 disableJspRuntimeCompilation 属性为 true,否则在 JSP 第一次被请求时,仍然要编译该 JSP。如果允许重新装载,则 reloadInterval 将决定从 JSP 被请求,到引擎开始检查重新装载是否有必要,这之间引擎要等待多少秒钟的时间。
JSP Engine 还提供了一个开发模式(development-mode)参数 trackDependencies。如果在部署期间服务器正被使用,那么当一个 JSP 的附属文件遭到更改时,重新编译该 JSP 是有益的。对于引擎来说,这是一种低效率的模式,因为这种模式要求文件系统对于每次请求都要检查 JSP。如果您想使用这个引擎参数,那么在将应用程序部署到 WebSphere Application Server 之前,应确保使用等效的批处理编译器参数 -- 批处理编译器将生成所有必需的附属文件跟踪信息,之后,引擎将在运行时使用这些信息。如果参数 trackDependencies 被设置为 true,那么除非是因为某个 JSP 遭到更改,或者其类文件已被删除,而重新编译了该 JSP,否则引擎不会自动地生成这种信息。
JSP Engine 参数 useThreadTagPool 和 usePageTagPool 可以使那些大量使用自定义标记的 JSP 提高性能。在进行批处理编译时,应确保将所需的等效批处理编译器参数设置为 true,以便 JSP Engine 能够在运行时使用池(pooling)。
批处理编译器命令
不管是 Windows 批处理文件(
JspBatchCompiler.bat ),还是 UNIX shell script (
JspBatchCompiler.sh ),这两个用来从命令行运行批处理编译器的文件都可以在
{WAS_ROOT}/bin 中找到。为了使用 Ant 执行批处理编译器,这里还提供了一个 Ant 任务(请参阅
批处理编译器 Ant 任务)。
批处理编译器命令看上去是这样的:
JspBatchCompiler
-ear.path <path> | -war.path <path> | -enterpriseapp.name <name>
[-response.file <filename>]
[-webmodule.name <name>]
[-filename <jsp name | directory name>]
[-config.root <path>]
[-cell.name <name>]
[-node.name <name>]
[-server.name <name>]
[-extractToDir <path>]
[-compileToDir <path>]
[-compileToWebInf <true|false>]
[-forceCompilation <true|false>]
[-trackDependencies <true|false>]
[-createDebugClassfiles <true|false>]
[-keepgenerated <true|false>]
[-keepGeneratedclassfiles <true|false>]
[-usePageTagPool <true|false>]
[-useThreadTagPool <true|false>]
[-classloader.parentFirst <true|false>]
[-classloader.singleWarClassloader <true|false>]
[-additional.classpath <classpath>]
[-verbose <true|false>]
[-deprecation <true|false>]
[-compileWithAssert <true|false>]
[-useJikes <true|false>]
[-jsp.file.extensions <file extensions to process>]
[-log.level <SEVERE | WARNING | INFO | CONFIG | FINE | FINER | FINEST | OFF>]
|
下面是从 Windows 命令提示符输入的一个示例批处理编译器命令:
C:\WAS\AppServer\bin>jspbatchcompiler -enterpriseapp.name sampleApp -forcecompilation true -verbose true
批处理编译器配置参数
- 批处理编译器配置参数不是大小写敏感的。例如:
-usePageTagPool 与
-usepagetagpool 是一样的。
- 每个参数后面都必须跟上它的值,参数和值之间由一个或多个空格隔开。例如:
-enterpriseapp.name myWebApplication
- 在命令行和响应文件中,参数可以以任何顺序出现。在下面的
可选的配置参数中我们描述了 response.file 参数。
三组配置参数以及它们的优先级
批处理编译器理解三组配置参数:
-
用于 Web 模块的 JSP Engine 配置参数。
这些参数是为特定 Web 模块的 JSP 支持而设置的,通常用于已部署的应用程序中。例如,对于很多版本的 WebSphere Application Server,都可以使用 keepgenerated 这个参数来控制由 JSP Engine 生成的 JSP 源文件的保存以及删除。
- JSP Engine 配置参数存储在 Web 模块的配置目录下的
WEB-INF/ibm-web-ext.xmi 文件中。配置目录的一个例子是:
{WAS_ROOT}/config/cells/cellname/applications/enterpriseappname/deployments/deployedname/webmodulename
- 如果应用程序是在将标志 "Use Binary Configuration" 设为 true 的情况下部署到 WebSphere Application Server 中的,那么就应该在 Web 模块的二进制目录,而不是配置目录中寻找
WEB-INF/ibm-web-ext.xmi 文件。二进制目录的一个例子是:
{WAS_ROOT}/installedApps/nodename/EnterpriseAppName/WebModuleName/
-
ibm-web-ext.xmi 中对应于 JSP Engine 配置参数的条目看上去类似于以下例子:
<jspAttributes xmi:id="JSPAttribute_6" name="keepgenerated" value="true"/>
-
响应文件配置参数。
这些参数可以在一个批处理编译器响应文件中找到。
-
批处理编译器命令行配置参数。
这些是在运行批处理编译器时在命令行输入的参数。
批处理编译器检查所有这三组配置参数,以决定在编译 JSP 时采用参数的哪个值。在决定一个给定参数的值时,优先级是这样的:
- 如果该参数出现在命令行,则直接使用它的值。如果该参数不在命令行,则批处理编译器查找
- 命令行指定的响应文件中的参数。如果没有指定响应文件,或者在响应文件中没有找到该参数,则批处理编译器检查
- Web 模块的 JSP Engine 配置参数中的参数。(请参阅
JSP Engine 配置参数。)
如果在这三组参数中都没有找到那个配置参数,那么就使用一个缺省值。在下面的
所需的配置参数和
可选的配置参数这两节中,给出了各配置参数的缺省值,以及对这些参数的描述。
所需的配置参数: 批处理编译器目标
在 ear.path、war.path 和 enterpriseapp.name 这三个参数中,有且只有一个参数是必需的。这些参数不一定要在命令行中给出。相反,它们也可以出现在响应文件中。
ear.path
| 指定到一个压缩或者展开的企业应用程序归档(EAR)的完整路径。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear
| |
使用案例
| 使用这个参数来批处理编译一个正处于开发阶段或者准备部署到 WebSphere Application Server 中的 EAR。注意,我们也可以通过这个参数来指向已部署的企业应用程序,方法是提供到这个已安装的企业应用程序根目录的完整路径。然而,如果已经将企业应用程序配置为使用共享库,那么在通过
ear.path 指向这些共享库的情况下,是不能使用这些共享库的。这时应该使用
enterpriseapp.name。
| |
缺省值:
| 无 |
war.path
| 指定到一个压缩或展开的 Web 应用程序归档(WAR)的完整路径。 | |
实例:
|
JspBatchCompiler -war.path c:\myproject\examples.war
| |
使用案例:
| 使用这个参数来批处理编译一个正处于开发阶段或者准备部署到 WebSphere Application Server 中的 WAR。我们也可以通过这个参数来指向一个已部署的企业应用程序中的某个 Web 模块,方法是提供到这个已安装的 Web 模块根目录的完整路径。与
ear.path 一样,如果已将企业应用程序配置为使用共享库,则在使用
war.path 的情况下将不能使用这些库。这时应该使用 enterpriseapp.name,或者使用 additional.classpath 参数将所需的类和 JAR 添加到批处理编译器类路径。
| |
缺省值:
| 无 |
enterpriseapp.name
| 指定已部署到 WebSphere Application Server 中的单个企业应用程序的名称。使用此参数时,不需要保证服务器正在运行。这个参数取决于 config.root、cell.name、node.name 和 server.name 这几个参数的正确设置。如果这些参数的缺省值对于您的环境来说不合适,那么应该通过命令行或者在响应文件中覆盖它们。 | |
实例:
|
JspBatchCompiler -enterpriseapp.name sampleApp
JspBatchCompiler -enterpriseapp.name App -webmodule.name my.war
-filename /aDir/main.jsp
| |
使用案例:
| 使用这个参数来批处理编译一个已部署到 WebSphere Application Server 中的企业应用程序。使用 webmodule.name 参数来编译应用程序内一个特定的 Web 模块。使用 filename 参数与 webmodule.name 参数一起来编译该 Web 模块中的一个特定 JSP 文件或目录。 | |
缺省值:
| 无 |
可选的配置参数
response.file
指定到一个文件的路径,该文件包含批处理编译器要使用的配置参数。response.file 只有当它在命令行中被给出时才使用。如果该参数出现在响应文件中,那么它将被忽略,以避免循环依赖。在
{WAS_ROOT}/bin 中有一个模板响应文件 batchcompiler.properties.default。通过复制该模板,您可以创建自己的响应文件,使其包含自己感兴趣的参数的缺省值。所有必需的和可选的参数(除了
response.file )都可以在一个响应文件中配置。
| |
实例:
|
JspBatchCompiler -response.file c:\myproject\batchc.props
| |
使用案例:
| 通过使用一个响应文件,为配置多个批处理编译器目标提供方便。 | |
缺省值:
| 无 |
webmodule.name
指定单个 Web 模块的名称,以便进行批处理编译。只有在给出了 ear.path 或 enterpriseapp.name 的时候,同时 Web 模块还必须在指定的 EAR 或企业应用程序中,才能使用这个参数。如果给出了
war.path ,那么 webmodule.name 将被忽略。
| |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -webmodule.name myWebModule.war
| |
使用案例:
| 当需要重新生成一个已部署的企业应用程序中某特定 Web 模块中的 JSP 时,这个参数会比较有用 -- 因为所有共享库和清单类路径附属文件都将可以使用。 | |
缺省值:
| 如果该参数没有给出,那么一个 EAR 或企业应用程序中的所有 Web 模块都将被编译。 |
filename
| 指定您想要编译的单个 JSP 文件的文件名。另外,如果 filename 设置为一个目录的名称,那么只有那个目录及其子目录下的 JSP 文件才被编译。这个名称是相对于 Web 模块的上下文根的。 | |
实例:
| 如果您想编译
myTest.jsp ,而该 JSP 在
/subdir/myJSPs 中,那么输入
-filename /subdir/myJSPs/myTest.jsp 。
如果您想编译
/subdir/myJSPs 及其子目录下的所有 JSP,那么输入
-filename subdir/myJSPs 。
| |
使用案例:
| 通常,当您要编译一个特定的 Web 模块,其中有指定的 JSP 文件或目录,就要给出这个参数。如果指定了一个企业应用程序或 EAR,但是没有提供 webmodule.name 参数,那么批处理编译器将在每个 Web 模块中寻找 filename,如果在每一个 Web 模块中都没有找到 filename,那么批处理编译器将返回一个失败值。 | |
缺省值:
| 在 Web 模块中的所有 JSP 都将被编译。输入
-filename / 等效于缺省情况。
|
config.root
| 指定 WebSphere 配置目录的位置。这个参数只有在给出了 enterpriseapp.name 的情况下才使用。 | |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -config.root c:\WAS\AppSever\altConfigDir
| |
使用案例:
| 必要时使用这个参数覆盖缺省值。 | |
缺省值:
| 通常为
{WAS_ROOT}/config 。缺省值可以从
{WAS_ROOT}/bin 中的
setupCmdLine.[bat/sh] 文件获得。
|
cell.name
| 指定应用程序安装时所在单元(cell)的名称。这个参数只有在给出了 enterpriseapp.name 的情况下才使用。 | |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -cell.name someCellName
| |
使用案例:
| 必要时使用这个参数覆盖缺省值。 | |
缺省值:
| 缺省值可以从
{WAS_ROOT}/bin 中的
setupCmdLine.[bat/sh] 文件中获得。此变量的符号名(symbolic name)是
WAS_CELL。
|
node.name
| 指定应用程序安装时所在节点(node)的名称。这个参数只有在给出了 enterpriseapp.name 的情况下才使用。 | |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -node.name someNodeName
| |
使用案例:
| 必要时使用这个参数覆盖缺省值。 | |
缺省值:
| 缺省值可以从
{WAS_ROOT}/bin 中的
setupCmdLine.[bat/sh] 文件中获得。该变量的符号名是
WAS_NODE。
|
server.name
| 指定应用程序安装时所在服务器的名称。这个参数只有在给出了 enterpriseapp.name 的情况下才使用。 | |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -server.name someServerName
| |
使用案例:
| 必要时使用这个参数覆盖缺省值。 | |
缺省值:
| server1 |
extractToDir
| 指定一个目录,预先部署的 EAR 和 WAR(由 ear.path 和 war.path 参数指定)在批处理编译器对它们进行操作之前将解压到此目录中。extractToDir 参数的用法如表 3 所描述。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -extractToDir c:\myTempDir
| |
使用案例:
| 在批处理编译一个压缩的归档之前,必须将其解压。同样,也可以将展开的归档解压到一个新的目录。在这两种情况下,解压操作都不会改动原始的归档,如果正处于开发阶段,这一特点可能会很有用。 | |
缺省值:
| 请参见
表 3。
|
表 3. extractToDir 参数
| |
展开的归档
|
压缩的归档
| | 提供 extractToDir | 批处理编译器在操作归档之前,先将其解压到 extractToDir。
如果在 extractToDir 中存在与该归档具有同样名称的文件或目录,则批处理编译器在解压归档之前,将完全删除这样的文件或目录。
如果批处理编译器没有错误,那么即使对原始 EAR 或 WAR 进行展开,批处理编译器仍将把归档压缩到 extractToDir 中。
如果在编译期间碰到了错误,那么即使对原始 EAR 或 WAR 进行了压缩,EAR 或 WAR 仍将处于展开状态。
| | 不提供 extractToDir | 批处理编译器在适当位置操作 EAR 或 WAR(不将其解压到另一个目录),当批处理编译器完成操作之后归档仍保持展开状态。 | 批处理编译器将把归档解压到由 JVM 属性 "java.io.tmpdir" 返回的那个目录中。在这种情况下,剩下来的行为与提供 extractToDir 情况下的行为是一样的。 |
compileToDir
| 指定一个目录,JSP 经过翻译后得到的 Java 源文件,而后又经过编译后得到的类文件都将放到此目录中。这个目录可位于文件系统的任何地方,但批处理编译器的缺省行为通常就够了。表 4 描述了批处理编译器在编译类文件时的行为。 | |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -compileToDir c:\myTargetDir
| |
使用案例:
| 这个参数使您能够将生成的 Java 文件和类文件放入一个完全在目标目录之外的目录中,如果您想要拿新生成的文件与这些文件先前的版本作比较,那么这一点就很有用,因为这样不会改动目标目录。 | |
缺省值:
| 请参见
表 4。
|
compileToWebInf
规定编译好的 JSP 类文件的目标目录应该是 Web 模块的
WEB-INF/classes 目录。这个参数只有在给出了 enterpriseApp.name 的情况下才使用,如果给出了 compileToDir ,则该参数将被 compileToDir 替换。
注意,批处理编译器的缺省行为是编译 Web 模块的
WEB-INF/classes 目录。表 4 描述了编译类文件时批处理编译器的行为。
| |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -compileToWebInf false
| |
使用案例:
| 如果给出了 enterpriseApp.name,并且您希望类文件经过编译后放入 WebSphere Application Server 临时目录,而不是 Web 模块的
WEB-INF/classes 目录中,那么将此参数设置为 false。建议:如果这个参数被设置为 false,只要在
WEB-INF/classes 目录中存在任何 JSP 类文件,就将 forceCompilation 设置为 true。
| |
缺省值:
| true;请参见
表 4。
|
表 4. 编译类文件时批处理编译器的行为
| |
给出了 ear.path 或 war.path
|
给出了 enterpriseApp.name
| | 没有给出 compileToDir;没有给出 compileToWebInf,或者此参数为 true | 类文件编译后放入 Web 模块的
WEB-INF/classes 目录。
| 类文件编译后放入 Web 模块的
WEB-INF/classes 目录。
| | 没有给出 compileToDir; compileToWebInf 为 false | 类文件编译后放入 Web 模块的
WEB-INF/classes 目录。
| 类文件编译后放入 WebSphere 临时目录(通常是
{WAS_ROOT}/temp )。
| | 给出了 compileToDir;没有给出compileToWebInf,或者此参数要么为 true,要么为 false | 类文件编译后放入由 compileToDir 指定的目录。 | 类文件编译后放入由 compileToDir 指定的目录。 |
forceCompilation
| 强制批处理编译器,重新编译所有的 JSP 资源,而不管该 JSP 是否已过期。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -forceCompilation true
| |
使用案例:
| 当需要创建一个用于部署的归档,确保所有 JSP 类为最新版本时,该参数特别有用 。 | |
缺省值:
| false |
trackDependencies
如果某个 JSP 的任何附属文件遭到更改,即使该 JSP 本身没有变化,此参数也会指示批处理编译器重新编译一个该 JSP。注意,对附属文件的跟踪会招致很大的运行时性能代价,因为对于每一次针对 JSP 的请求,JSP Engine 都要检查文件系统,看是否有该 JSP 的附属文件被更改。WebSphere Application Server 所跟踪的附属文件有:
- 在该 JSP 中静态包括的文件。
- 该 JSP 所使用的标记文件。
- 该 JSP 所使用的 TLD 文件(不包括 JAR 中的 TLD)。
| |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -trackDependencies true
| |
使用案例:
| 在开发环境中比较有用。 | |
缺省值:
| false |
createDebugClassfiles
| 指示批处理编译器生成包含 SMAP 信息(根据 JSR 45, Debugging Support for Other Languages)的类文件。 | |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -createDebugClassfiles true
| |
使用案例:
| 如果您想在 IDE 中调试 JSP,那么使用这个参数。 | |
缺省值:
| false |
keepgenerated
| 指示批处理编译器保留在处理过程中的翻译阶段所创建的 Java 源文件。这些文件与生成的类文件位于同一个目录中。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -keepgenerated true
| |
使用案例:
| 如果您想回顾由批处理编译器生成的 Java 代码,那么使用这个参数。 | |
缺省值:
| false |
keepGeneratedclassfiles
| 指示批处理编译器保留在编译 Java 源文件时所创建的类文件。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -keepGeneratedclassfiles false -extractToDir c:\myTempDir-keepgenerated false -keepGeneratedclassfiles false
| |
使用案例:
| 如果您只想查看 JSP 当中是否有翻译或编译错误,而不关心生成的类文件,那么可以使用这个参数。如果同时还给出了一个值为 false 的 keepgenerated 参数,那么这个参数将导致所有生成的文件在批处理编译器完成操作之前被删除。 | |
缺省值:
| true |
usePageTagPool
| 启用或禁用对自定义标记处理程序基于单个 JavaServer Page 的重用。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -usePageTagPool true
| |
使用案例:
| 使用这个参数来启用对标记处理程序基于 JSP 页面的重用。 | |
缺省值:
| false |
useThreadTagPool
| 启用或禁用对自定义标记处理程序基于每个 Web 模块、每个请求线程的重用。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -useThreadTagPool true
| |
使用案例:
| 使用这个参数来启用对标记处理程序基于 Web 模块的重用。 | |
缺省值:
| false |
classloader.parentFirst
| 装载类时的搜索顺序。缺省情况下,在搜索应用程序类装载器(classloader)之前先搜索父类装载器。这个参数只有在给出了 ear.path 或 enterpriseApp.name 的情况下才使用。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -classloader.parentFirst false
| |
使用案例:
| 如果 Web 模块包含一个也出现在服务器 lib 目录中的 JAR,而您又希望优先使用 Web 模块的 JAR,那么可以将此参数设置为 true。 | |
缺省值:
| true |
classloader.singleWarClassloader
| 指定是每个 EAR 使用一个类装载器,还是每个 WAR 使用一个类装载器。这个参数只有在给出了 ear.path 或 enterpriseApp.name 的情况下才使用。 | |
实例:
|
JspBatchCompiler -ear.path c:\myproject\sampleApp.ear -classloader.singleWarClassloader true
| |
使用案例:
| 如果一个 Web 模块依赖于同一个企业应用程序内另一个 Web 模块中的 JAR 和类,那么可以将此参数设置为 true。 | |
缺省值:
| false:对于每个 WAR 创建一个类装载器,而看不到其他 Web 模块中的类。 |
additional.classpath
指定解析和编译 JSP 页面时所使用的附加类路径条目。这个参数只有在给出了
war.path 的情况下才使用。如果目标是
war.path ,则批处理编译器不会使用 WebSphere Shared Libraries。因此,举例来说,如果您的 WAR 依赖于在 WebSphere Application Server 中作为 Shared Library 配置的 JAR,那么可以使用这个选项来指向该 JAR。此外,如果给出了
war.path ,并使用了
-extractToDir 参数,那么 WAR 清单类路径中的任何 JAR 都将不会添加到类路径(因为 WAR 本身并没有解压到其所在 EAR 之外的地方)。在这种情况下,可以使用
-additional.classpath 来指向必需的 jar。 添加到各种所需资源的完整路径,并用独立于系统的路径分隔符将它们隔开。
| |
实例:
|
JspBatchCompiler war.path c:\myproject\examples.war -additional.classpath c:\myJars\someJar.jar;c:\myClasses
| |
使用案例:
| 使用这个参数来添加 WAR 之外的类路径 JAR 和类。在运行时,必须通过标准 WebSphere Application Server 配置机制使这些相同的 JAR 和类可用。 | |
缺省值:
| 空 |
verbose
| 指定是否输出关于编译 JSP 时编译器的动作的信息。 | |
实例:
|
JspBatchCompiler war.path c:\myproject\examples.war -verbose true
| |
使用案例:
| 如果您想查看 Java 编译器类装载信息和其他信息,那么可以将此参数设置为 true。 | |
缺省值:
| false |
deprecation
| 指定在编译 JSP 时是否应该发出不赞成(deprecation)警告。 | |
实例:
|
JspBatchCompiler war.path c:\myproject\examples.war -deprecation true
| |
使用案例:
| 如果您想查看 Java 编译器 deprecation 消息,那么可以将此参数设置为 true。 | |
缺省值:
| false |
compileWithAssert
| 告诉批处理编译器启用断言(assertion)。如果 compileWithAssert 为 true,则批处理编译器将把 -source 1.4 选项传递给 javac 编译器。如果 compileWithAssert 为 false,则不会有选项发送给 javac 编译器。javac 的缺省行为是正常编译代码,即使使用了字断言(word assert)作为常规标识符也是如此。 | |
实例:
|
JspBatchCompiler war.path c:\myproject\examples.war -compileWithAssert true
| |
使用案例:
| 如果您想在 JSP 中使用断言功能,并且希望在运行时能够开启断言,那么可以将此参数设置为 true。 | |
缺省值:
| false |
useJikes
| 指定在编译 Java 源文件时是否应该使用 Jikes (注意:WebSphere Application Server 没有自带 Jikes)。 | |
实例:
|
JspBatchCompiler ear.path c:\myproject\sampleApp.ear -useJikes true
| |
使用案例:
| 为了使批处理编译器使用 Jikes 作为 Java 编译器,将此参数设置为 true。 | |
缺省值:
| false |
jsp.file.extensions
指定批处理编译器所处理的文件扩展名。其格式是用分号或冒号分隔的列表,形如
*.ext1 ;
*.ext2:*.extn 。注意,对于 Servlet 2.4 来说,这个参数是不必要的,因为可以使用部署描述符中 jsp-property-group 元素的 url-pattern 属性来标识那些应该视作 JSP 的扩展名。
| |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -jsp.file.extensions *jspz;*.jspt
| |
使用案例:
| 使用这个参数来添加附加的由批处理编译器处理的扩展名。 | |
缺省值:
| 空。请参阅
JSP 文件扩展名。
|
log.level
| 指定在批处理编译期间将被送至控制台的日志记录级别。这个参数的值有 SEVERE | WARNING | INFO | CONFIG | FINE | FINER | FINEST | OFF 。 | |
实例:
|
JspBatchCompiler -enterpriseApp.name sampleApp -log.level FINEST
| |
使用案例:
| 将这个参数的值设置得更高或更低,以控制日志记录输出。如果值为 FINEST,那么将生成最详细的输出。这对于调试很有用。 | |
缺省值:
| CONFIG |
批处理编译器 ant 任务
ant 任务 JspC 公开所有批处理编译器配置选项。该任务在幕后执行批处理编译器。它与 WebSphere Application Server 5.x 版本的 JspC ant 任务向后兼容。表 5 列出了所有 ant 任务属性以及与它们等效的批处理编译器参数。在清单 1 中展示了一个实例 build.xml。在
下载文件中提供了 JspC 的 Javadoc。
表 5. JspC ant 任务属性以及与它们等效的批处理编译器参数
|
JspC 属性
|
等效的批处理编译器参数
|
earPath
|
-ear.path
|
warpath
|
-war.path
|
src
Same as
warPath , for backward compatibility
|
-war.path
|
enterpriseAppName
|
-enterpriseapp.name
|
responseFile
|
-response.file
|
webmoduleName
|
-webmodule.name
|
fileName
|
-filename
|
configRoot
|
-config.root
|
cellName
|
-cell.name
|
nodeName
|
-node.name
|
serverName
|
-server.name
|
extractToDir
|
-extractToDir
|
compileToDir
|
-compileToDir
|
toDir
same as
compileToDir , for backward compatibility
|
-compileToDir
|
compileToWebInf
|
-compileToWebInf
|
forceCompilation
|
-forceCompilation
|
trackDependencies
|
-trackDependencies
|
createDebugClassfiles
|
-createDebugClassfiles
|
keepgenerated
|
-keepgenerated
|
keepGeneratedclassfiles
|
-keepGeneratedclassfiles
|
usePageTagPool
|
-usePageTagPool
|
useThreadTagPool
|
-useThreadTagPool
|
classloaderParentFirst
|
-classloader.parentFirst
|
classloaderSingleWarClassloader
|
-classloader.singleWarClassloader
|
additionalClasspath
|
-additional.classpath
|
classpath
same as
additionalClasspath , for backward compatibility
|
-additional.classpath
|
verbose
|
-verbose
|
deprecation
|
-deprecation
|
compileWithAssert
|
-compileWithAssert
|
useJikes
|
-useJikes
|
jspFileExtensions
|
-jsp.file.extensions
|
logLevel
|
-log.level
|
wasHome
| 无 |
classpathref
| 无 |
清单 1. 使用 JspC 任务的示例 build.xml
<project name="jsp" default="jspc_test" basedir=".">
<taskdef name="wsjspc" classname="com.ibm.websphere.ant.tasks.JspC"/>
<target name="jspc_test" description="example usage of JspC task">
<wsjspc wasHome="C:\WAS\AppSer"
earpath="C:\WAS\AppSer\installedApps\sdjt30\myApp.ear" webmodulename="examples.war"
forcecompilation="true"
verbose="false"
deprecation="false"
loglevel="CONFIG"
/>
</target>
</project>
|
结束语
WebSphere Application Server 批处理编译器是一种高度可配置的工具,它支持对压缩和展开的 EAR 及 WAR 中的 JSP,以及已部署到 WebSphere Application Server 上企业应用程序中的 JSP 进行编译。批处理编译器可以帮助简化应用程序的部署,因为它支持将 JSP 预先编译后直接放入 Web 模块。批处理编译器知道所有的 JSP Engine 运行时配置属性,这样就可以直接生成在运行时引擎中可以使用的 JSP 类文件,而不必预先编译。在应用程序部署期间,批处理编译器是一种方便的工具,可用于验证所有 JSP 文件以及它们所包括的文件是否合法,以及验证它们所依赖的所有类和 JAR 是否可见。
致谢
作者想要感谢 Todd Kaplinger 和 Richard Backhouse 对本文所作出的贡献。
下载 | 名字 | 大小 | 下载方法 |
|---|
| JSPBatchcompilerWAS6TD.zip | 7 KB | HTTP |
关于作者  | |  |
Scott Johnson是 WebSphere Application Server JSP Engine 的小组负责人。他于 2000 年加入 IBM,在 Research Triangle Park Lab 工作,在此之前的 17 年他曾担任程序员和项目负责人。
|
对本文的评价
|