私は完全にシンプルなJava SFTPファイル転送に使用するライブラリを探しています。それ以外の機能は必要ありません。
私はZehonを試してみましたが、それは信じられないほど厄介で、8つのjarファイルは、必要な機能がほとんどないので少しおかしいと思います。
また、ライブラリーは(無料のビールのように)無料であり、望ましいオープンソース(必須ではない)でなければなりません。
ありがとう。
編集:JSchはまだ多くの場所で使用されているため、以前の回答をそのまま使用しますが、より適切にドキュメント化されたライブラリが必要な場合は、 sshj を使用できます。これを使用してsftpを実行する方法の例は次のとおりです。
SSHClient ssh = new SSHClient();
ssh.loadKnownHosts();
ssh.connect("Host");
try {
ssh.authPassword("username", "password");
SFTPClient sftp = ssh.newSFTPClient();
try {
sftp.put(new FileSystemFile("/path/of/local/file"), "/path/of/ftp/file");
} finally {
sftp.close();
}
} finally {
ssh.disconnect();
}
JSch (a Java ssh lib、Antで使用されるなど)を使用すると、次のようなことができます。
Session session = null;
Channel channel = null;
try {
JSch ssh = new JSch();
ssh.setKnownHosts("/path/of/known_hosts/file");
session = ssh.getSession("username", "Host", 22);
session.setPassword("password");
session.connect();
channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
sftp.put("/path/of/local/file", "/path/of/ftp/file");
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} finally {
if (channel != null) {
channel.disconnect();
}
if (session != null) {
session.disconnect();
}
}
この方法でJSchを直接、または Commons VFS を使用して使用できますが、その場合はcommons vfs jarとjsch jarの両方が必要になります。
以下は、sshキーのチェックを気にすることなく JSch を使用した例の完全なソースコードです。
import com.jcraft.jsch.*;
public class TestJSch {
public static void main(String args[]) {
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("username", "127.0.0.1", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("password");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get("remotefile.txt", "localfile.txt");
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (SftpException e) {
e.printStackTrace();
}
}
}
Exit()およびdisconnect()は、finallyブロックに配置する必要があります。この例では、2番目のスレッドが終了しないため、例外が発生した場合にプログラムが終了することはありません。