Overview

HermesはMavenのリポジトリを利用した自動アップデートを実現するAPIです.以下の操作が可能です.

  • アップデート可能なライブラリを複数のMavenのリポジトリで検索できる.
  • アップデート可能なライブラリが見つかれば,それをダウンロード,インストールできる.
  • もし,アップデート可能なライブラリに新たな依存ライブラリがあったとき,それらも自動的にダウンロード,インストールできる.

最近 依存ライブラリを解決するために Maven のリポジトリを利用するプロ ジェクトが増えています.Apache Ant のサブ プロジェクト Ivymvnbeans などが その代表例でしょう.

しかし,そのほとんどがビルドを目的としており,実行時にダウンロード, インストールするものは寡聞ながら知りません.Ivyやmvnbeansを実行時に動 かすのもトリッキーな感じになりそうです.それくらいなら1から作ってしま えということで,作ったのがこのHermesです.

このHermesはオンラインアップデートを目的としているため,Mavenのローカ ルリポジトリにライブラリをインストールすることや,Mavenのリモートリポ ジトリにデプロイすることはできません.そのような用途にはMavenを使うこ とを前提とし,Mavenで行うには複雑な処理となるオンラインアップデートの みを解決します.

また,このHermesは実行時にMavenを含むその他のライブラリを必要としませ ん.そのため,手作業でライブラリを管理するアプリケーションに対しても Hermesを適用しやすくなっています.

Hermesの動作手順

  1. 設定ファイルからHermesContextオブジェクトを生成する.
  2. HermesContextから更新対象ライブラリ(dependency)を取得.
    1. 更新対象ライブラリの最新バージョンを検索する.
    2. もし,見つからなければ RepositoryItemNotFoundException を投げて更新が失敗する.
  3. dependencyの依存関係を解決する.
    1. 全てのdependencyの依存関係を再帰的に解決する.
    2. もし,依存関係にあるライブラリが見つからなければ RepositoryItemNotFoundException を投げて更新が失敗する.
  4. 依存関係ツリー(TREE1)が作成される.
    1. もし,依存関係ツリーの中に同じgroupId,artifactIdを持ち,バージョンが異なるものが存在すればVersionMismatchException を投げて更新が失敗する.
  5. 依存関係ツリーの中から更新すべきライブラリを更新リストに登録する.その際,updating-policy に従い,以下のような処理を行う.
    1. DESTINATION_CHECK
      1. TREE1を順番に見て,destination にあるjarファイルと比べ,バージョンが異なるライブラリであれば,更新リストに登録する.
    2. REPOSITORY_CHECK
      1. 設定ファイルに書かれているバージョンの依存関係ツリー(TREE2)を作成する.
      2. TREE1とTREE2でバージョンが異なっているものについて,更新リストに登録する.
    3. NO_CHECK
      1. TREE1にあるライブラリを全て更新リストに登録する.
  6. 更新リストに登録されているライブラリでdestinationに存在するライブラリをアンインストールする(拡張子をjarからuninstalledに変更する).
  7. 更新リストに登録されているライブラリをダウンロードし,destinationに保存する.
  8. HermesContextの更新対象ライブラリのバージョンを更新する.

Known bugs

既知のバグというかなんというか.

  • ネットワーク経由のアクセスが多く,何度もリモートリポジトリに問い合わせに行く.
    • そういうものです.
  • 更新リストへの登録方法が練りきれていない.
    • その通りです.とりあえず動くものを作るのが今現在の目標です.