ファイルやディレクトリーのftp転送を行うオプションタスク。
(org.apache.tools.ant.taskdefs.optional.net.FTP extends
Task)
タスク自体はオプションタスクとしてデフォルトのantに入っているが、実行には別ライブラリー(jarファイル)が必要。
|
savarage.orgからNetComponentsをダウンロードし、$ANT_HOME/libにNetComponents.jarをコピーする。また、読込権限を付ける必要がある。
$ cp NetComponents.jar $ANT_HOME/lib $ cd $ANT_HOME/lib $ chmod +r NetComponents.jar $ ls NetComponents.jar README ant.jar optional.jar xercesImpl.jar xml-apis.jar
Eclipse3のAntでそのままftpタスクを実行した場合、以下のような例外が発生する。[2008-11-26]
BUILD FAILED java.lang.NoClassDefFoundError: org/apache/commons/net/ftp/FTPClient
BUILD FAILED Could not create type ftp due to java.lang.NoClassDefFoundError: org/apache/commons/net/ftp/FTPClientConfig
Apacheのcommons-netをAntのクラスパスに追加しておく必要がある。
ただし、commons-net-2.0.jarはJDK1.5向け(クラスバージョン49.0)にコンパイルされているので、JRE1.5以降のjavaコマンドでないと使えない。
JRE1.4以前のjavaコマンドで実行するとUnsupportedClassVersionErrorが発生する。
java.lang.UnsupportedClassVersionError: org/apache/commons/net/ftp/FTPClient (Unsupported major.minor version 49.0) java.lang.UnsupportedClassVersionError: org/apache/commons/net/ftp/FTPClientConfig (Unsupported major.minor version 49.0)
実行したいbuild.xmlの属するJavaプロジェクトに対し、JREシステム・ライブラリーをJRE1.5以降にしておく必要がある。
属性 | 説明 | デフォルト | 備考 | 更新日 |
---|---|---|---|---|
action="アクション名" | get,put等のftpアクション。 | |||
server="サーバー名" | 接続先のサーバー名またはIPアドレス。 | |||
userid="ユーザー名" | 接続先のログイン用ユーザー名。 | |||
password="パスワード" | 接続先のログイン用パスワード。 | |||
binary="yes" | バイナリーモードで転送する。 | yes | 2008-11-26 | |
remotedir="パス" | 接続先のディレクトリー。 | 2008-11-26 | ||
depends="yes" | yesにすると、タイムスタンプが新しいファイルだけ転送する。 | no | 2009-01-06 | |
timediffauto="true" | trueにすると、リモートとの時間差を自動的に計算する。 (リモートディレクトリーに書き込み権限が必要らしい) →例 |
Ant1.6以降 | 2009-01-06 | |
listing="ファイル名" | actionがlist(ファイル一覧取得)の場合に必須。 ファイル一覧を格納するファイルを指定する。 |
2008-11-26 | ||
verbose="yes" | 転送したファイル名も表示されるようになる。 | 2008-11-27 |
ファイルの一覧を取得する例。[2008-11-26]
<target name="ftp"> <ftp server="192.168.x.y" userid="user" password="pass" action="list" listing="./ftplist.txt" remotedir="/getdir"> <fileset> <include name="*" /> </fileset> </ftp> </target>
ftplist.txtというファイルに/getdirの直下にあるファイル一覧(ディレクトリーは含まれない)が格納される。
(ファイルに出力される内容はサーバー依存らしい)
filesetにdir属性を付けても無視される。(接続先のディレクトリーはあくまでftpのremotedir属性で指定する)[2008-11-27]
includeのname属性に"**"を指定すると、サブディレクトリー全てのファイルが対象となる。
ローカルにあるtest.txtをリモートのデフォルトの場所に送信する例。
<target name="put"> <ftp server="localhost" userid="user" password="pass"> <fileset dir="."> <include name="test.txt"/> </fileset> </ftp> </target>
actionを省略すると、send(put)を指定したことになる。
depends属性をyesにすると、新しいファイルだけが転送される。[2008-11-27]
サーバーの時計と誤差がある場合には、timediffautoをtrueにすると自動的に時間差を計算してくれる。
(その計算の際にテンポラリーにファイル(ant〜.tmp)を作るらしく、そのファイルを削除する為の(と思われる)deleteタスクが動く)
<target name="put"> <ftp server="localhost" userid="user" password="pass" action="put" depends="yes" timediffauto="true"> <fileset dir="."> <include name="test.txt"/> </fileset> </ftp> </target>
<target name="get"> <ftp action="get" server="localhost" userid="user" password="pass"> <fileset dir="getdir"> <include name="bin/*"/> </fileset> </ftp> </target>
サーバー側のbinディレクトリー直下のファイルを
ローカル側のgetdirというディレクトリーの下にコピーする。
その結果、getdir/binというディレクトリーが出来る。
includeの指定がname="*"のみだと、直下のファイルのみがコピー対象となり、ディレクトリーはコピーされない。
したがって、再帰的にコピーしたい場合はname="**/*"とする必要がある。
また、転送するファイルが1つも無いと、ローカル側のディレクトリー自体も作成されない。