使用Ant进行Web开发(第二部分)

来源:百度文库 编辑:神马文学网 时间:2024/04/19 17:49:21
建立简单的Web部署
既然已经有了WAR文件(或 CAB文件), 是时候转向Web应用程序开发的部署了。如果你工作的机器本身就是一台Web服务器,部署将简单到只是把.war文件拷贝到服务器的相应应用程序目录。例 8-2说明了这一点; 这个创建文件建立和拷贝了一个 .war文件到Tomcat的webapps 目录.当你(重)启动Tomcat,这个.war文件就会被自动释放到一个同名的文件夹下(省去了.war扩展名),同时这个Web应用程序也就准备好了,在这个例子中,其URL是http://localhost:8080/app (如果你正在部署一个Servlet, URL将会反映出Servlet的包结构,例如http://localhost:8080/org/antbook/ch08/app说明Serlet类的结构org.antbook.ch08.app.)。
例 8-2. Tomcat部署的创建文件 (ch08/simple/build.xml)



"c:/tomcat/jakarta-tomcat-5.0.19/webapps"/>








你可以使用Ant的 ftp 任务(查看第4章)来远程地部署到一个Web服务器的基础目录下。
使用SCP来部署
另一种从Ant 1.6开始的有效部署方式是SCP,它把一个文件或者FileSet从一个运行SSH (译者注:指SSH daemon。Daemon- [计] Internet中用于邮件收发的后台程序) 的远程主机上拷贝 (或者拷贝到远程主机上)。这种方式是一种可选的方式,而且你需要把jsch.jar 放到Ant的lib目录下来使用 (你可以从以下地址得到jsch.jar: http://www.jcraft.com/jsch/index.html)。
用这种方式部署起来很方便。例如,下面是一个怎样把一个单独的文件部署到一台远程主机的例子 (任何的主机,除非你明确地设置trust的属性为yes或者true,否则它一定要在你的已知主机 (knownhosts) 列表中):
todir="user:password@antmegacorp.com:/home/steven/cgi-bin"/>
你可以明确的使用password属性来设置密码:
todir="user@antmegacorp.com:/home/steven/cgi-bin""
password="password"/>
如何拷贝一个远程文件到本地机器:
todir="${archive}"/>
如何利用fileset来拷贝一组文件:





例8-3给出了一个完整的利用scp方式来部署的构造文件。(它使用了远程主机的IP地址来代替了命名远程服务器。)
例 8-3. 利用scp (ch08/scp/build.xml)







${message}















todir="user:password@000.000.000.000:cgi-bin"/>


这是刚才的构造文件在Windows机器上运行时候的样子:
%ant
Buildfile: build.xml
init:
[mkdir] Created dir: C:\ant\ch08\scp\bin
compile:
[javac] Compiling 1 source file to C:\ant\ch08\scp\bin
compress:
[jar] Building jar: C:\ant\ch08\scp\bin\Project.jar
deploy:
[scp] Connecting to 000.000.000.000
[scp] Sending: Project.jar : 664
[scp] File transfer time: 1.32 Average Rate: 9502.27 B/s
[scp] done.
main:
[echo]
[echo] Deploying the .jar file.
[echo]
BUILD SUCCESSFUL
Total time: 12 seconds
小技巧: 正如在第4章的时候说过的一样,在一个构造文件中对密码和/或用户名的显式编码 (hardcoding-也有人称硬编码) 是一种不好的选择。使用属性会是一种较好的办法,象下面这样:

象下面这样把用户名和密码传递给Ant:
ant -Dusername=steven -Dpassword=opensesame
在文件被scp 方式所拷贝的时候,它的Unix文件许可并没有被保留(实际上它们得到的是UMASK许可)。如果你想保留Unix许可,用Unix下的scp 命令来代替(例如, ).
表 8-3. scp任务属性

你可以使用fileset 元素来选择一组文件来拷贝;如果你使用了fileset,你就必须为todir属性指定一个值. (fileset 元素只在你拷贝本地文件到远程主机时可用)
部署到Tomcat
作为servlet和JSP的参考Web服务器,Tomcat (可从http://jakarta.apache.org/tomcat/得到),自从它包含了自定义的Ant部署方式,就变得更吸引Ant开发者。
从你的Tomcat5复制文件server/lib/catalina-ant.jar到Ant的lib目录来使用那些任务。
Tomcat部署任务包括部署, 重新加载,反部署 (卸载); 要使用他们,增加这些taskdef元素(在第11章讨论了) 到你的建造文件:



想使用这些任务, 你需要Tomcat管理员权限; 象下面这样编辑conf/tomcat-users.xml为一个用户名增加管理员权限(这里是admin)和口令:








roles="tomcat,role1"/>

你能像下面这样使用部署任务在Ant中部署一个Web应用程序到Tomcat:

username="${manager.username}"
password="${manager.password}"         path="${app.path}"
localWar="file://${build}"/>

在这里manager.url是Tomcat管理器的servlet的URL。
这servlet的缺省值名字是“manager”,因此看起来象http://localhost:8080/manager。
app.path属性表示的是这个应用程序应该被部署的上下文路径(通常是“/”加上你想要在URL中联机访问的应用程序的的名字)。
build属性表示的是在你要在什么位置来建立Web应用程序,比喻说是Tomcat的webapps目录。
如果你已经安装一个应用程序并且想要Tomcat认出你最新的Java类,使用reload(重新加载任务)代替:

username="${manager.username}"
password="${manager.password}"
path="${app.path}"/>

删掉一个Web应用程序, 使用undeploy任务:

username="${manager.username}"
password="${manager.password}"
path="${app.path}"/>

部署到Tomcat
更平常的情况是,你将不会在你想部署到的服务器上进行你的应用程序的开发。 你可以通过浏览器中的URL访问到Tomcat管理器的Servlet进而达到在一台运行了Tomcat的远程主机上部署的目的。
在Ant中实现这一点你需要get任务,当你把一个URL传递给它时它得到一份文件。如果你正在使用Java 1.4或更新版本,这个任务支持任何URL schema, 包括http:, ftp:, jar:,和 https:。如果你想要下载联机的内容,那么这个任务是较大的,或,如在本例中, 通过URLs向联机的代码发布命令。
在开始部署前,这个例子使用get命令修改Ant主页并保存成ant.html:

你能通过传递一个要上传的Web应用程序的本地位置给管理器的servlet来实现为Tomcat上传Web应用程序的目的。
例如,从Windows的C:/ant/ch08/app上传一个Web应用程序,你将使用这个位置:
file:////C:\ant\ch08\app/
上传一个.war文件, 你在位置的最后加一个!来说明你上传的是一个文件而不是目录的内容,在Unix中象下面这样:
jar:file://///ant/ch08/app.war!/
例子8-3展示的是在实践的如何工作。
在这个例子中, 构造文件从C: \ant\deploy\app(org.antbook.ch08.Deploy)部署一个Web应用程序到Tomcat,它包含一个显示"Project Deployment"的servlet。
这是你要传递给的get任务的URL来告诉Tomcat管理器servlet你想要干什么:
http://localhost:8080/manager/deploy?path=/deployment&
war=file:////c:\ant\deploy\app/
在例子8-4你能看到如何工作。
例子8-4 部署与get(ch08/get/build.xml)






dest="deploy.txt"
username="${tomcat.username}"
password="${tomcat.password}" />


下面是构造文件在实际中运行时候的样子:
%ant
Buildfile: build.xml
main:
[get] Getting: http://localhost:8080/manager/deploy?
path=/deployment&war=file:////c:\ant\ch08\get\app/
BUILD SUCCESSFUL
Total time: 1 second
这是Tomcat输出到deploy.txt中的文件内容:
OK - Deployed application at context path /deployment
在部署以后, 通过http://localhost:8080/deployment/org.antbook.ch08.Deploy显示出部署的servlet,如图8-1。

图 8-1. 部署到Tomcat
小技巧: 想要得到Tomcat管理servlet上的更多的信息,查看Tomcat的manager/html-manager-howto.html。
get任务的属性在表8-4列出.
表 8-4. get任务属性

小技巧:  当verbose 被设置为true的时候,任务会每接受100K显示一个点(.)。
编译JSPs
当部署到服务器时, jspc任务是很有用的。 这个任务运行JavaServer Pages编译器并且把JSP页变成Java源代码,也可以在javac任务中实现。 编译JSP页支持JSP网页的快速调用, 在没有完全的JDK服务器上的部署, 或让你不用部署就可以检查他们网页的语法。 缺省情况下,这个任务使用由Tomcat自带的Jasper JSP编译器。 拷贝Tomcat的jasper-compiler.jar和jasper-runtime.jar文件进Ant的lib目录来使用这个任务。 你将需要在Ant lib目录下放置由Tomcat带来的servlet.jar。
例如, 你有这JSP页面, greeting.jsp:


Creating a Greeting


Creating a Greeting


<%
out.println("Hello from JSP!");    //Display the greeting
%>


例子8-5显示出怎么编译这JSP成greeting.java。
例子8-5 编译JSP页(ch08/jspc/build.xml)







${message}






srcdir="${src}"
destdir="${output}"
package="org.antbook.jsp"
verbose="9">




下面是你在运行构造文件时候所要看到的:
%ant
Buildfile: build.xml
init:
compile:
[jspc] Compiling 1 source file to
/home/steven/ant/ch08/jspc/bin/org/antbook/jsp
[jasperc] 2004-06-30 02:20:09 - Class name is:
greeting
[jasperc] 2004-06-30 02:20:09 - Java filename is:
/home/steven/ant/ch08/jspc/bin/org/antbook/jsp/greeting.java
[jasperc] 2004-06-30 02:20:09 - Accepted
org.apache.jasper.compiler.Parser$Scriptlet at /greeting.jsp(7,4)
[jasperc] 2004-06-30 02:20:09 - Compiling with: -encoding UTF8
main:
[echo]
[echo] Compiling the JSP....
[echo]
BUILD SUCCESSFUL
Total time: 3 seconds
下面是Java代码结果greeting.java看起来的样子:
package org.antbook.jsp.;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
public class greeting extends HttpJspBase {
static {
}
public greeting( ) {
}
private static boolean _jspx_inited = false;
public final void _jspx_init( )
throws org.apache.jasper.runtime.JspException {
}
public void _jspService(HttpServletRequest request, HttpServletResponse
response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
.
.
.
out.println("Hello from JSP!");    //Display the greeting
.
.
.
}
}
下面是另一个例子,它编译JSP页,检查相关性, 并且使用javac任务为这JSP创建实际的bytecode:
destdir="temp"
srcdir="${src}"
package="org.antbook.ch08">


srcdir="temp"
destdir="${bin}"
classpath="lib/app.jar"/>
srcdir="temp"
destdir="${bin}"
classpath="lib/app.jar" />
在表8-5你能看见jspc任务的属性。
表 8-5. jspc任务的属性

jspc任务是一个基于目录的任务,因此被编的JSP文件用javac任务定位一样的方法定位文件, 它意味着你能使用嵌套元素,例如includes 和 excludes。你能使用嵌套的classpath和classpathref元素, 象嵌套的webapp元素一样。唯一出现在jspc任务中的webapp元素, 指示JSP编译器创建一个全部Web应用程序程序。一个webapp元素的属性是basedir属性, 它设置应用程序的根目录。在它下级子目录必须有一个WEB-INF子目录。如果你使用这元素, 这个任务使用编译器检查所有的相关性。
下面是一个使用webapp的例子:
package="org.antbook.ch08">



部署至EJB 容器
基本上,部署JavaBean到企业(EJB) 应用服务器相似于你已经看见的另外的Ant部署工程。你能使用这任务来打包并且部署EJB应用。 例如,在例子8-6你会看到一个为JBoss服务器开发的构造文件; 构造文件首先创造一个.war文件然后把它打包进一个用来部署的.ear文件。
例8-6 一个Jboss EJB构造文件(ch08/ejb/build.xml)







value="${basedir}/output/deploymentdescriptors"/>

value="${basedir}/output/war"/>











         



         




todir="${eardir}/META-INF" />



这就是全部。尽管这构造文件使用标准的Ant任务工作,被构造了进Ant的任务使以ear任务开始的EJB应用程序工作更容易。
创建ear文件
创造ear任务是容易的.ear文件并且为在大多数ear需要的application.xml文件做特殊的预备。
它没有强制使用这个任务创造一个.ear文件,但是它能使生活更容易。
在表8-6你能看见这个任务的属性。
小技巧: ear任务是一个有为application.xml的特殊的待遇的对Jar任务的扩展。
你可以进行一样的操作,在一个zip或者jar任务中使用prefix(前缀)和fullpath属性。
表8-6 ear任务的属性

从zip任务的扩充的支持属性 prefix, fullpath,和src的zipfileset元素, 在ear任务也同样可以办到。 嵌套的metainf元素规定一个fileset; fileset包括的所有的文件在.ear文件的META-INF目录的结束。
这个任务允许你使用appxml属性设定从什么地方得到application.xml。 下面是一个创建.ear文件的例子:



支持热部署
serverdeploy任务被设计成支持热部署 (在部署前你不必关闭服务器) 到EJB- aware的服务器。 你设置action属性为你做见过的属性,像为Tomcat 管理器servlet设置使用了的那些: "deploy", "delete", 和 "undeploy"。
小技巧: 你可能需要vendor-specific来完成这个工作。
Ant提供build-end, 但是你的服务器需要提供Ant能连结与并且交往的一套部署工具。
在写这篇文章时, 这个任务仅仅支持Weblogic服务器和JOnAS 2.4开放源代码EJB服务器, 但是对另外的EJB容器的支持应该快被增加。
这个任务有仅仅2属性,在表8-7被列出, 并且要求一些嵌套元素。
 
表8-7 serverdeploy任务的属性

generic元素
如果你从服务器生产商得到Java类的部署代码,这是一个用于基于Java的部署的通用元素。如果有一个厂家特定的元素给serverdeploy使用,那当然使用它;但如果没有,那请使用通generic元素。
在表8-8此元素的属性被列出。
表8-8 generic元素的属性

generic元素支持嵌套的arg和jvmarg元素。下面是一个假定目标Web服务器是org.steven.j2ee.config.Deploy时,使用generic元素的部署文件的例子:

classpath="${classpath}"
username="${user.name}"
password="${user.password}">




weblogic元素
weblogic元素用于运行weblogic.deploy部署工具; 此工具的合法的actions包括:deploy, undeploy, list, update, 和 delete.。
在表8-9这些元素的属性被列出。
表8-9 weblogic元素的属性

下面是一个使用这个serverdeploy元素内部的元素来部署WebLogic服务器的例子:

server="ff19://server:7001"
classpath="${weblogic.home}/lib/weblogic.jar"
username="${user.name}"
password="${user.password}"
component="appserver,productionserver" />

jonas元素
jonas单元支持部署到JOnAS (Java Open Application Server, Java开放应用服务器) 服务器。 JOnAS部署工具 (org.objectweb.jonas.adm.JonasAdmin) 的有效actions有
deploy, undeploy, list 和 update.
在表8-10这元素的这些属性别列出。
表8-10。 jonas元素的属性

小技巧: 如果你准备根据从服务器回应的延期时间来编译一个延期任务,使用Ant waitfor任务。 你可以使用sleep任务来实现这个目的。
 
jonas单元支持嵌套的classpath, arg,和jvmarg单元。 下面是一个使用serverdeploy部署到一个JOnAS服务器的例子:







Steve Holzner是O‘Reilly出版的 upcoming Eclipse: A Java Developer‘s Guide的作者。_xyz
使用Ant进行Web开发(第二部分) 使用开源软件设计、开发和部署协作型 Web 站点,第 5 部分: Drupal 入门 使用开源软件设计、开发和部署协作型 Web 站点,第 13 部分: Eclipse 中的 ... 使用开源软件设计、开发和部署协作型 Web 站点,第 14 部分: announcemen... 使用SWT开发WEB应用 使用SWT开发WEB应用 使用开源软件设计、开发和部署协作型 Web 站点,第 10 部分: 外部网 Web 站点的... AJAX开发简略 (第二部分) 用firefox进行Web开发调试 使用开源软件设计、开发和部署协作型 Web 站点,第 11 部分: 使用 Drupal 中... 使用开源软件设计、开发和部署协作型 Web 站点,第 8 部分: 使用 CSS 对主题化内... 使用 Ant 与 UltraEdit-32 构建 Java 开发环境 使用开源软件设计、开发和部署协作型 Web 站点,第 1 部分: 简介和概述 使用开源软件设计、开发和部署协作型 Web 站点,第 2 部分: 设计有效的用户体验 使用开源软件设计、开发和部署协作型 Web 站点,第 6 部分: 在 Drupal 中构建... 使用开源软件设计、开发和部署协作型 Web 站点,第 12 部分: 主机托管和部署 使用开源软件设计、开发和部署协作型 Web 站点,第 3 部分: 在 Windows 中建... 使用开源软件设计、开发和部署协作型 Web 站点,第 4 部分: 在 Linux 中建立开... 使用开源软件设计、开发和部署协作型 Web 站点,第 12 部分: 主机托管和部署 用DataStage 进行数据整合:第二部分 为 WebSphere Application Server Community Edition 开发 Spring 应用程序: 第 2 部分:使用 Spring 进行数据库连接管理 使用Axis开发Web Service程序 使用AppFuse进行开发的总结 嵌入式开发中使用DDD进行调试