Developing for the Web with Ant, Part 2
by Steve HolznerEditor's Note: In Part 1 of this two-part excerpt from Ant: The Definitive Guide, 2nd Edition, Steve Holzner covered the tasks designed for packaging web applications, including war, cab, ear, and jspc. This week he covers the tasks for deploying web apps with get, serverdeploy, and scp.
Creating Simple Web Deployment
With
a WAR file (or CAB file), it's time to turn to the
deployment side of the Web development equation. If
you're working on the same machine as a Web server,
deployment can be as easy as copying a .war file
to the application base directory for the server. Example 8-2 illustrates the point; this build file creates
and copies a .war file over to the Tomcat
webapps directory. When you (re)start Tomcat,
the .war file will expand automatically into a
directory of the same name (minus the .war
extension), and the Web application will become available, in this
case, at http://localhost:8080/app. (If
you're deploying a servlet, the URL will reflect the
servlet's package, as in http://localhost:8080/org/antbook/ch08/app
for the servlet class org.antbook.ch08.app.)
Example 8-2. Build file for Tomcat deployment (ch08/simple/build.xml)
<?xml version="1.0" encoding = "UTF-8"?>
<project default="main" basedir=".">
<property name="src" location="source" />
<property name="wardir" location=
"c:/tomcat/jakarta-tomcat-5.0.19/webapps"/>
<property name="warfile" location="${wardir}/app.war"/>
<target name="main" depends="war">
<echo message="Deploying the Web app...."/>
</target>
<target name="war" >
<war destfile="${warfile}" webxml="${src}/app.xml" basedir="${bin}" />
</target>
</project>
You can use Ant's
ftp task (see Chapter 4) for
remote deployment to a Web server's base
directories.
Deploying with SCP
Another
deployment task, available since Ant 1.6, is the
scp task, which copies a file or FileSet to or
from a remote machine running the SSH daemon. This task is an
optional one, and you need jsch.jar in the Ant
lib directory to use it (you can get
jsch.jar at http://www.jcraft.com/jsch/index.html).
This task is handy for deployment. For
example, here's how to deploy a single file to a
remote host (any host you connect to must be listed in your
knownhosts file unless you specifically set the
trust attribute to yes or true):
<scp file="Project.jar"
todir="user:password@antmegacorp.com:/home/steven/cgi-bin"/>
You can use the
password attribute explicitly to set the password:
<scp file="Project.jar"
todir="user@antmegacorp.com:/home/steven/cgi-bin""
password="password"/>
Here's how to copy a remote file to a local machine:
<scp file="user:password@antmegacorp.com:/home/steven/cgi-bin/Project.jar"
todir="${archive}"/>
Here's how to copy a set of files using a fileset:
<scp todir="user:password@antmegacorp.com:
/home/steven/source">
<fileset dir="${src}">
<include name="**/*.java"/>
</fileset>
</scp>
Example 8-3 gives a complete example build file using the
scp task for deployment. (It uses the remote
machine's IP address instead of naming the remote
server.)
Example 8-3. Using scp (ch08/scp/build.xml)
<?xml version="1.0" ?>
<project default="main">
<property name="message" value="Deploying the .jar file." />
<property name="src" location="source" />
<property name="output" location="bin" />
<target name="main" depends="init, compile, compress, deploy">
<echo>
${message}
</echo>
</target>
<target name="init">
<mkdir dir="${output}" />
</target>
<target name="compile">
<javac srcdir="${src}" destdir="${output}" />
</target>
<target name="compress">
<jar destfile="${output}/Project.jar" basedir="${output}">
<include name="*.class"/>
<include name="*.txt"/>
</jar>
</target>
<target name="deploy">
<scp trust="true" file="${output}/Project.jar"
todir="user:password@000.000.000.000:cgi-bin"/>
</target>
</project>
Here's what that build file output looks like when run on a Windows machine:
%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
TIP: As discussed in Chapter 4, hardcoding passwords and/or usernames in a build file is a bad idea. It's better to use properties like this:
Pass the username and password to Ant like this:<scp todir="${username}:${password}@antmegacorp.com: /home/steven/source" ...>
Unix file permissions are not retained when files are copied with theant -Dusername=steven -Dpassword=opensesamescptask (they getUMASKpermissions). If you want to retain Unix permissions, execute the Unixscpcommand instead (i.e.,<execexecutable="scp" ... >).
The attributes of this task appear in Table 8-3.
Table 8-3. The scp task's attributes
|
Attribute |
Description |
Required |
Default |
|---|---|---|---|
|
|
Specifies whether you want to stop the build if the task encounters an error. |
No |
|
|
|
Specifies the file you want to transfer. You can give a local path or a remote path of the form user[:password]@host:/directory/path. |
Yes, unless a nested | |
|
|
Specifies the location of a file holding the private key you want to use. |
Yes, if you are using key-based authentication. | |
|
|
Specifies the known hosts file, which can be used to validate remote hosts. |
No |
${user.home}/.ssh/known_hosts. |
|
|
Specifies the passphrase for your private key. |
Yes, if you are using key-based authentication. | |
|
|
Specifies the password you want to use for logging in. |
No if you are using key-based authentication or the password has been given in the file or todir attribute. | |
|
|
Specifies the port you want to connect to on the remote host. |
No |
|
|
|
Specifies the directory you want to copy to. This can be a local path or a remote path of the form user[:password]@host:/directory/path. |
Yes | |
|
|
Specifies you want to trust all unknown hosts if set to yes/true. If set to false (the default), the host you connect to must be listed in your knownhosts file. |
No |
|
You
can use fileset elements to select sets of files
to copy; if you use a fileset, you must assign a value to the
todir attribute. (The fileset
element works only when you're copying files from
the local machine to a remote machine.)
Pages: 1, 2 |