HermesはMavenのリポジトリを利用した自動アップデートを実現するAPIです.以下の操作が可能です.
- アップデート可能なライブラリを複数のMavenのリポジトリで検索できる.
- アップデート可能なライブラリが見つかれば,それをダウンロード,インストールできる.
- もし,アップデート可能なライブラリに新たな依存ライブラリがあったとき,それらも自動的にダウンロード,インストールできる.
最近 依存ライブラリを解決するために Maven のリポジトリを利用するプロ ジェクトが増えています.Apache Ant
のサブ プロジェクト Ivy
や mvnbeans
などが その代表例でしょう.
しかし,そのほとんどがビルドを目的としており,実行時にダウンロード, インストールするものは寡聞ながら知りません.Ivyやmvnbeansを実行時に動 かすのもトリッキーな感じになりそうです.それくらいなら1から作ってしま えということで,作ったのがこのHermesです.
このHermesはオンラインアップデートを目的としているため,Mavenのローカ ルリポジトリにライブラリをインストールすることや,Mavenのリモートリポ ジトリにデプロイすることはできません.そのような用途にはMavenを使うこ とを前提とし,Mavenで行うには複雑な処理となるオンラインアップデートの みを解決します.
また,このHermesは実行時にMavenを含むその他のライブラリを必要としませ ん.そのため,手作業でライブラリを管理するアプリケーションに対しても Hermesを適用しやすくなっています.
Hermesの動作手順
- 設定ファイルからHermesContextオブジェクトを生成する.
- HermesContextから更新対象ライブラリ(dependency)を取得.
- 更新対象ライブラリの最新バージョンを検索する.
- もし,見つからなければ RepositoryItemNotFoundException
を投げて更新が失敗する.
- dependencyの依存関係を解決する.
- 全てのdependencyの依存関係を再帰的に解決する.
- もし,依存関係にあるライブラリが見つからなければ RepositoryItemNotFoundException
を投げて更新が失敗する.
- 依存関係ツリー(TREE1)が作成される.
- もし,依存関係ツリーの中に同じgroupId,artifactIdを持ち,バージョンが異なるものが存在すればVersionMismatchException
を投げて更新が失敗する.
- 依存関係ツリーの中から更新すべきライブラリを更新リストに登録する.その際,updating-policy に従い,以下のような処理を行う.
- DESTINATION_CHECK
- TREE1を順番に見て,destination にあるjarファイルと比べ,バージョンが異なるライブラリであれば,更新リストに登録する.
- REPOSITORY_CHECK
- 設定ファイルに書かれているバージョンの依存関係ツリー(TREE2)を作成する.
- TREE1とTREE2でバージョンが異なっているものについて,更新リストに登録する.
- NO_CHECK
- TREE1にあるライブラリを全て更新リストに登録する.
- 更新リストに登録されているライブラリでdestinationに存在するライブラリをアンインストールする(拡張子をjarからuninstalledに変更する).
- 更新リストに登録されているライブラリをダウンロードし,destinationに保存する.
- HermesContextの更新対象ライブラリのバージョンを更新する.
既知のバグというかなんというか.
- ネットワーク経由のアクセスが多く,何度もリモートリポジトリに問い合わせに行く.
- 更新リストへの登録方法が練りきれていない.
- その通りです.とりあえず動くものを作るのが今現在の目標です.