Java
Maven
rsync

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