Mavenリポジトリのアーティファクト一括抽出するスクリプト

明けましておめでとうございます。まったく新年と関係ないエントリから始まりますが、今年もよろしくお願いします。

この休みで少しでもGroovyに慣れようとまたちょいプロ作ったので、簡単に紹介します。


概要

今回作成したのは、RepoArtifactExtractorというGroovyスクリプトです。Mavenリポジトリをばーっと検索して、リポジトリに登録されている最新アーティファクトの一覧をみんな大好きExcelさんにばーっと書きだしてくれます。こんな感じに。

f:id:ikikko:20110102015937p:image

セントラルリポジトリに登録されているものはMaven Repository: Search/Browse/Exploreとか使えば簡単に検索できるけど、インハウスリポジトリとか建てたときにアーティファクト一覧をばーっと見たいときに使えるでしょう。ま、SonatypeのNexus使えばって話もごもっともですがw*1

実行方法

Githubにソースを置いてます*2。結構ベッタベタな書き方で、お世辞にも美しくはないです。

こちらをpullしてからーの下記のコマンドで、(groupId, artifactId, version)とおまけでivy形式の設定内容が記載されたExcelファイルが作成されます。

/usr/bin/groovy RepoArtifactExtractorScript.groovy
  artifacts.xls
  http://maven.seasar.org/maven2/org/seasar/cubby/
(本当は1行)

あとは、これをCRONなりHudsonの定期実行なりで1日1回でも回しておけば。

余談

今回、中身はPOI*3 + NekoHTMLでのHTMLスクレイピングという構成なので、大して目新しいものはありません。なんで、余談的にいくつか。

HTMLスクレイピング

上記で示したコマンド実行例ではSeasarリポジトリを対象にしていますが、ルートからではなく"http://maven.seasar.org/maven2/org/seasar/cubby/"のようにCubbyというプロダクトだけに絞っています。ご存知の通り、HTMLスクレイピングはWebサーバに負担をかけるんで、検証では極力小さい範囲のスクレイピングで済むようにしていました。もちろん、スクリプトの処理自体も極力負荷を抑えるように小細工はしてますが。

スクレイピングのご利用は、計画的に。

Grape

GroovyのGrapeを使うと、単体のgroovyファイルだけで依存Jarの解決ができます。Groovyの実行環境さえあれば(pom.xmlなどの設定ファイルが不要で)スクリプトファイルをポンと渡すだけで動かすことができるんですね。シェルスクリプトの代わりにGrape付きGroovyスクリプトを呼び出すとかも、効果的な使い方かな。

Grapeの詳細は、id:ksky さんの↓の資料を見てもらえれば。

POMの解析

プログラム上からPOMを解析するには、ModelBuilderクラス辺りを使えばできます。使用方法は、テストケースから何となく分かるでしょう。

ただ、結局このAPIは使わずにベタにPOMをXMLとして解析しています。(ValidationLevelを最低にしても)parentのpomを参照しにいくみたいで、Mavenリポジトリ上のディレクトリ構造ではparentが参照できずに解析エラーとなってしまうケースがあったので。

Excelの処理

ひっそりとGExcelAPI v0.2をリリースしました - 豆無日記がよさそうだったので、当初はPOIの代わりにこれを使おうと考えてました。ただ、これってExcelファイルの参照しかできないんですよね。残念><

POIに比べて直感的で分かりやすかったんで、更新ができるようになるといいなぁ・・・とプレッシャーをかけてみるテスト。


今回学んだもの

  • GroovyでのHTMLスクレイピングのやり方
  • Apache POI / GExcelAPIの使い方
  • プログラム上からPOMを解析する方法

*1:ちなみに、一応Tomcat6の上に載せようとしたけど、うまくデプロイできませんでした。今回の主目的ではなかったので、深追いはしてませんが。

*2:何か不要なディレクトリがGithub上に残ってる。気持ち悪いけど、とりあえずほっておきます。

*3:いつの間にかOffice 2007以降のOffice Open XML形式にも対応してたんですね。