S-JIS[2004-01-04/2009-01-06] 変更履歴

Ant:ftp

ファイルやディレクトリーの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

インストール(Eclipse向け)

Eclipse3のAntでそのままftpタスクを実行した場合、以下のような例外が発生する。[2008-11-26]

Eclipse3.2(Ant1.6):

BUILD FAILED
java.lang.NoClassDefFoundError: org/apache/commons/net/ftp/FTPClient

Eclipse3.4(Ant1.7):

BUILD FAILED
Could not create type ftp due to java.lang.NoClassDefFoundError: org/apache/commons/net/ftp/FTPClientConfig

Apacheのcommons-netをAntのクラスパスに追加しておく必要がある。

  1. commons-net-2.0.jarをダウンロードしてくる。
  2. commons-net-2.0.jarを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="ファイル名" actionlist(ファイル一覧取得)の場合に必須。
ファイル一覧を格納するファイルを指定する。
    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つも無いと、ローカル側のディレクトリー自体も作成されない。


Ant目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま