JavaでSFTP接続を行う
作成日時:2024-08-08
更新日時:2024-08-08
JavaでSFTP接続を行う際のメモ。
非常に参考になったサイト
私の記事を読むより、こちらの記事を読んでください。
Spring Boot + Spring Integration でいろいろ試してみる ( その1 )( SFTP でファイルアップロードするバッチを作成する ) - かんがるーさんの日記
実装方法の選定
下記の手法が考えられた。
- JSchを使用する
- バッチ/シェルを呼び出す
- Spring Integrationを使用する
私はSpring IntegrationのSFTPライブラリを使用する事にした。
理由は下記。
- 柔軟性がある。
- JSchに比べて、メンテナンスされる保証が高い。
- Spring経験者の場合、学習コストを下げられる。
- ※Springを使用する場合。
他の手法を見送った理由
JSch
JavaでSFTPを行うためのライブラリ。
セキュリティ面とサポート面に問題があるため、採用を見送った。
「Java SFTP」で検索をすると、大体このライブラリを使用した記事が出てくる。
ライブラリの取得先は下記の2種類がある。
- com.jcraft
- com.github.mwiede
前者は、最後のコミットが2019/06かつセキュリティに問題があるらしい。
※後者のGitHubのreadmeにセキュリティ問題の記載あり。
後者は、上記のセキュリティ問題の為にフォークしたプロジェクトらしいが、いつまでサポートされるか不安である。
その為、Spring Integrationを使用した方がよいと判断した。
バッチ呼び出し
シェルやバッチにSFTPコマンドを記載し、Javaからそれを呼ぶ方法。
シンプルなので、小規模なシステムならこれで良いと思われる。
バッチ等で処理の最後に1回だけSFTP接続する、とか。
何回もSFTPを実行したりする場合、いろいろと面倒になると思う。
- サーバーへの接続設定の管理方法の煩雑さ
- 例外発生時のハンドリング
- パフォーマンス問題
- 開発環境と実行環境の差異吸収
- 開発環境:Windows、実行環境:Linuxとか。
- Dockerを使えばいいが、学習コスト増大/開発環境の動作が遅くなるなどの問題が発生する。
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アプリケーションとして起動したほうが良い。