Section 8.4. Deploying with SCP

8.4. 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

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=""/>

You can use the password attribute explicitly to set the password:

<scp file="Project.jar"       todir="""       password="password"/>

Here's how to copy a remote file to a local machine:

<scp file=""      todir="${archive}"/>

Here's how to copy a set of files using a fileset:

<scp todir="">     <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@"/>     </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       [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

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}" ...>

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., <exec executable="scp" ... >).

The attributes of this task appear in Table 8-3.

Table 8-3. The scp task's attributes






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




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.



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.




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.




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.




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.



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.)

    Ant. The Definitive Guide
    Ant: The Definitive Guide, 2nd Edition
    ISBN: 0596006098
    EAN: 2147483647
    Year: 2003
    Pages: 115
    Authors: Steve Holzner © 2008-2017.
    If you may any questions please contact us: