我们注意到,这个文件首先使用默认的目标(default属性的值)定义了一个项目元素(project)。默认的目标会在命令行中没有指定目标的 情况下运行。在项目元素中,开头的几个元素用于定义特性(property)。这些特性元素可以用来定义在整个构建文件中使用的变量。例如,这个文件中设 置了源目录和jar文件目录对应的变量,以便后面使用。而且,在后面元素的属性中,也可以看到以${变量名}形式引用的特性。接着,在定义目标之前,还设 置了一个路径元素(path)。这个元素中列出了jar文件和classpath中的目录。当在后面要使用classpath时,可以通过它的ID来引 用。
第一个目标(target)是compile-gwt,即通过GWT编译器编译GWT模块。但是,相应的模块并没有在这个目标中指定,而是使用 了${app}占位符。我们也没有将这个模块定义为一个特性,因此可以通过命令行参数,以传递变量的形式传入要编译的模块。这样一来,就为这个构建文件赋 予了一定的灵活性,使它能够用于多个应用程序。运行这个目标会为应用程序编译生成JavaScript文件,同时将该项目所有的公共文件复制到www目录 下的应用程序目录中(原文有遗漏,已补充。——译者注)。
第二个目标是compile,即使用常规的javac编译器来编译其他Java类文件。这些类文件是指在服务器端运行的代码,其中可能包含提供 GWT-RPC服务的servlet(如果用到的话)。在这里,Ant脚本会把这些类复制到WEB-INF/classes目录中(原文www directory有误。——译者注)。这个目录是servlet容器Web应用程序中保存类的标准位置。
最后一个目标是deploy,即将必需的GWT库(gwt-servlet.jar)复制到WEB-INFO/lib目录中。这个目录是 servlet容器Web应用程序中保存jar文件的标准位置。这个目标也将把预定义的web.xml文件复制到WEB-INFO目录中(原文www directory有误。——译者注)。而web.xml文件是用于描述Web应用程序中servlet的必要文件。
运行这个针对第9章的Instant Messenger应用程序的任务,会得到如图4-51所示的输出。在这一步执行完成后,应该会在servlet容器中建立一个www目录及相应的应用程 序目录(原文有遗漏,已补充。——译者注),而且也遵循了servlet容器对文件名和目录结构的约定,结果如图4-52所示。
![]() |
图4-51 使用Ant完成编译和部署 |
![]() |
图4-52 Ant脚本的输出结果 |