X(Twitter) Zenn GitHub RSS 共有

JavaでSFTP接続を行う

作成日時:2024-08-08
更新日時:2024-08-08

JavaでSFTP接続を行う際のメモ。

非常に参考になったサイト

私の記事を読むより、こちらの記事を読んでください。

Spring Boot + Spring Integration でいろいろ試してみる ( その1 )( SFTP でファイルアップロードするバッチを作成する ) - かんがるーさんの日記

実装方法の選定

下記の手法が考えられた。

私はSpring IntegrationのSFTPライブラリを使用する事にした。
理由は下記。

他の手法を見送った理由

JSch

JavaでSFTPを行うためのライブラリ。
セキュリティ面とサポート面に問題があるため、採用を見送った。

「Java SFTP」で検索をすると、大体このライブラリを使用した記事が出てくる。
ライブラリの取得先は下記の2種類がある。

前者は、最後のコミットが2019/06かつセキュリティに問題があるらしい。
後者のGitHubのreadmeにセキュリティ問題の記載あり。

後者は、上記のセキュリティ問題の為にフォークしたプロジェクトらしいが、いつまでサポートされるか不安である。

その為、Spring Integrationを使用した方がよいと判断した。

バッチ呼び出し

シェルやバッチにSFTPコマンドを記載し、Javaからそれを呼ぶ方法。

シンプルなので、小規模なシステムならこれで良いと思われる。
バッチ等で処理の最後に1回だけSFTP接続する、とか。

何回もSFTPを実行したりする場合、いろいろと面倒になると思う。

Java上で処理すれば、上記の問題はすべて無くなる。
その為、Spring Integrationを使用した方がよいと判断した。

実装

GitHubにアップしたので、それを参照されたし。

トラブルシューティング/メモ

実行するとスタックトレースが出る

実行すると下記のログが出た。

 [main] WARN org.springframework.integration.expression.ExpressionUtils -- Creating EvaluationContext with no beanFactory
java.lang.RuntimeException: No beanFactory
 at org.springframework.integration.expression.ExpressionUtils.createStandardEvaluationContext(ExpressionUtils.java:90)
...以下、スタックトレース

結論から話すと、ただのWARNログ。
spring integration - Runtime exception thrown by GatewayProxyFactoryBean - Stack Overflow

消したければapplication.propertiesに下記の設定を追加し、ログ対象外とする。

logging.level.root=INFO
logging.level.org.springframework.integration.expression.ExpressionUtils=ERROR

Spring Applicationでなくとも動く

(当たり前だけど)

今回の実装は、修正すればSpring Applicationとしてではなく、通常のJavaアプリケーションとして実行できる。

Spring起動時のオーバーヘッドが気になるならば、Spring Applicationとしてではなく、通常のJavaアプリケーションとして起動したほうが良い。

参考リンク