ONJava.com -- The Independent Source for Enterprise Java
oreilly.comSafari Books Online.Conferences.

advertisement

AddThis Social Bookmark Button O'Reilly Book Excerpts: Ant: The Definitive Guide, Second Edition

Developing for the Web with Ant, Part 2

by Steve Holzner

Editor'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:

<scp todir="${username}:${password}@antmegacorp.com:
   /home/steven/source" ...>
Pass the username and password to Ant like this:

ant -Dusername=steven -Dpassword=opensesame
Unix file permissions are not retained when files are copied with the scp task (they get UMASK permissions). If you want to retain Unix permissions, execute the Unix scp command 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

failonerror

Specifies whether you want to stop the build if the task encounters an error.

No

true

file

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 fileset element is used.

keyfile

Specifies the location of a file holding the private key you want to use.

Yes, if you are using key-based authentication.

knownhosts

Specifies the known hosts file, which can be used to validate remote hosts.

No

${user.home}/.ssh/known_hosts.

passphrase

Specifies the passphrase for your private key.

Yes, if you are using key-based authentication.

password

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.

port

Specifies the port you want to connect to on the remote host.

No

22

todir

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

trust

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

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

Next Pagearrow