Posted at

rsync4j - Javaでrsyncを触りたい。

どうもぉ。はにおかさいです。

某サービスの開発のために、rsyncが使いたいなぁと。それもjavaで。

ところが、javaで実装されたrsync風的なものは見当たりませんでした。

調べていくうちに以下のものを見つけました


https://github.com/fracpete/rsync4j


概要

このrsync4jというものは、windowsとLinuxで動作する、rsyncのフロントエンドです。

windowsでは、rsyncに必要なファイルを一度どこかにバイナリを配備して、それを実行することによりrsyncをします。


テスト

普通に動く、うん

Z:\users\desktop\a>ls
rsync4j-all-3.1.2-12-spring-boot.jar

Z:\users\desktop\a>java -jar rsync4j-all-3.1.2-12-spring-boot.jar
usage: com.github.fracpete.rsync4j.RSync
[-h] [--output-commandline] [--maxtime MAXTIME] [-v]
[--info INFO] [--debug DEBUG] [--msgs2stderr] [-q] [--no-motd] [-c]
[-a] [-r] [-R] [--no-implied-dirs] [-b] [--backup-dir BACKUPDIR]
[--suffix SUFFIX] [-u] [--inplace] [--append] [--append-verify] [-d]
[-l] [-L] [--copy-unsafe-links] [--safe-links] [--munge-links] [-k]
[-K] [-H] [-p] [-E] [--chmod CHMOD] [-X] [-o] [-g] [--devices]
[--specials] [-t] [-O] [-J] [--super] [--fake-super] [-S]
[--preallocate] [-n] [-W] [-x] [-B BLOCKSIZE] [-e RSH]
[--rsync-path RSYNCPATH] [--existing] [--ignore-existing]
[--remove-source-files] [--delete] [--delete-before]
[--delete-during] [--delete-delay] [--delete-after]
[--delete-excluded] [--ignore-missing-args] [--delete-missing-args]
[--ignore-errors] [--force] [--max-delete MAXDELETE]
[--max-size MAXSIZE] [--min-size MINSIZE] [--partial]
[--partial-dir PARTIALDIR] [--delay-updates] [-m] [--numeric-ids]
[--usermap USERMAP] [--groupmap GROUPMAP] [--chown CHOWN]
[--timeout TIMEOUT] [--contimeout CONTIMEOUT] [-I] [-M REMOTEOPTION]
[--size-only] [--modify-window MODIFYWINDOW] [-T TEMPDIR] [-y]
[--compare-dest COMPAREDEST] [--copy-dest COPYDEST]
[--link-dest LINKDEST] [-z] [--compress-level COMPRESSLEVEL]
[--skip-compress SKIPCOMPRESS] [-C] [-f FILTER] [--exclude EXCLUDE]
[--exclude-from EXCLUDEFROM] [--include INCLUDE]
[--include-from INCLUDEFROM] [--files-from FILESFROM] [-0] [-s]
[--address ADDRESS] [--port PORT] [--sockopts SOCKOPTS]
[--blocking-io] [--stats] [-8] [--human-readable] [--progress] [-i]
[--out-format OUTFORMAT] [--log-file LOGFILE]
[--log-file-format LOGFILEFORMAT] [--password-file PASSWORDFILE]
[--list-only] [--bwlimit BWLIMIT] [--outbuf OUTBUF]
[--write-batch WRITEBATCH] [--only-write-batch ONLYWRITEBATCH]
[--read-batch READBATCH] [--protocol PROTOCOL] [--iconv ICONV]
[--checkum-seed CHECKSUMSEED] [-4] [-6] [--version]
[--additional ADDITIONAL] src dest
com.github.fracpete.rsync4j.RSync: error: too few arguments

Z:\users\desktop\a>java -jar rsync4j-all-3.1.2-12-spring-boot.jar Z:\users\desktop\a Z:\users\desktop\a\a
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries extractBinaries
情報: Setting up rsync4j environment in 'C:\Users\hani\rsync4j'...
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries extractBinaries
情報: Creating directory: C:\Users\hani\rsync4j\bin
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries extractBinaries
情報: Creating directory: C:\Users\hani\rsync4j\home\hani\.ssh
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries extractBinaries
情報: Copy your public key pairs into: C:\Users\hani\rsync4j\home\hani\.ssh
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygcom_err-2.dll' to 'C:\Users\hani\rsync4j\bin\cygcom_err-2.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygcrypto-1.0.0.dll' to 'C:\Users\hani\rsync4j\bin\cygcrypto-1.0.0.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cyggcc_s-seh-1.dll' to 'C:\Users\hani\rsync4j\bin\cyggcc_s-seh-1.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cyggssapi_krb5-2.dll' to 'C:\Users\hani\rsync4j\bin\cyggssapi_krb5-2.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygiconv-2.dll' to 'C:\Users\hani\rsync4j\bin\cygiconv-2.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygintl-8.dll' to 'C:\Users\hani\rsync4j\bin\cygintl-8.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygk5crypto-3.dll' to 'C:\Users\hani\rsync4j\bin\cygk5crypto-3.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygkrb5-3.dll' to 'C:\Users\hani\rsync4j\bin\cygkrb5-3.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygkrb5support-0.dll' to 'C:\Users\hani\rsync4j\bin\cygkrb5support-0.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygwin1.dll' to 'C:\Users\hani\rsync4j\bin\cygwin1.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/cygz.dll' to 'C:\Users\hani\rsync4j\bin\cygz.dll'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/ssh.exe' to 'C:\Users\hani\rsync4j\bin\ssh.exe'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/rsync.exe' to 'C:\Users\hani\rsync4j\bin\rsync.exe'
9 16, 2018 9:59:32 午後 com.github.fracpete.rsync4j.core.Binaries copyResourceTo
情報: Copying resource 'com/github/fracpete/rsync4j/windows-x86_64/ssh-keygen.exe' to 'C:\Users\hani\rsync4j\bin\ssh-keygen.exe'
skipping directory a

Z:\users\desktop\a>java -jar rsync4j-all-3.1.2-12-spring-boot.jar -av Z:\users\desktop\a Z:\users\desktop\a\a
sending incremental file list
a/
a/rsync4j-all-3.1.2-12-spring-boot.jar
a/a/

sent 9,556,407 bytes received 47 bytes 19,112,908.00 bytes/sec
total size is 9,553,886 speedup is 1.00

Z:\users\desktop\a>


Javaでの呼び出し。

mavenにこんな感じで書いてください。

<dependency>

<groupId>com.github.fracpete</groupId>
<artifactId>rsync4j-all</artifactId>
<version>3.1.2-12</version>
</dependency>

例 いずれも非同期ではありません。


オプションの設定

 // rsync -av /backupmoto/  /backupsaki/ --delete  --exclude='nozokitai/'

RSync rsync = new RSync()
.source("/backupmoto/")
.destination("/backupsaki/")
.archive(true).verbose(true).delete(true).exclude("nozokitai/");
CollectingProcessOutput output = null;
try {
output = rsync.execute();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(output.getStdOut());
System.out.println("Exit code: " + output.getExitCode());
if (output.getExitCode() > 0)
System.err.println(output.getStdErr());

////



オプションを配列で投げる

        //rsync -av /backupmoto/  /backupsaki/ --delete  --exclude='nozokitai/'

RSync rsync;
try {
rsync = new RSync();
rsync.setOptions(new String[]{"-av", "/backupmoto/", "/backupsaki/", "--delete", "--exclude='nozokitai/"});
CollectingProcessOutput output = rsync.execute();
System.out.println(output.getStdOut());
System.out.println("Exit code: " + output.getExitCode());
if (output.getExitCode() > 0)
System.err.println(output.getStdErr());
} catch (Exception e) {
e.printStackTrace();
}


まとめ

できればjavaで実装されてるのが良かったのですが、バイナリを実行させる形態でもいいのかなぁと。実運用で何かわかったら、還元したいと思います。


Ref

https://fracpete.github.io/rsync4j/windows/

http://www.atmarkit.co.jp/ait/articles/1702/02/news031.html