第53回コラム
「Java言語とMavenリポジトリ」
情報アーキテクチャ専攻 助教 長尾雄行
「Java言語とMavenリポジトリ」
一般的に、エンドユーザが使用するアプリケーションには、Webブラウザを使ってネットワーク経由で使用するサーバサイドアプリケーションと、パソコン等の端末にインストールして使用するクライアントサイドアプリケーションがあります。Java言語の場合、基本的にどちらのタイプのアプリケーションでも開発することが可能ですが、サーバサイドアプリケーションの方がより広く使われています。
Java言語がサーバサイドで活用される理由は複合的です。エンドユーザの視点に立つと、サーバサイドアプリケーションでは、インストールや初期設定等の準備をしなくても、エンドユーザが使いたいときにすぐに活用できるという点が挙げられます。クライアントサイドアプリケーションでは、アプリケーションのインストールという手間を省くことが困難です。
開発者の視点に立つと、サーバサイドアプリケーションの方がオープンソースソフトウェアを組み込んでアプリケーションを開発しやすいという理由が挙げられます。Java言語の場合、多数の開発者がオープンソースのライブラリを公開しており、Maven Central Search Engine [1] や mvnrepository [2] 等の検索サイトでライブラリを探して利用することができます。
ライブラリの活用の際に問題となるのがライセンスです。ライセンスはライブラリによって異なります。アプリケーションの配布に制約が多いGPL(GNU General Public License)や、制約が少ないBSD(Berkeley Software Distribution)系のライセンス等、ライセンスの種類も多種多様です。サーバサイドの場合、アプリケーション自体をエンドユーザに配布しないので、ライセンスの制約がクライアントサイドほど厳しくありません。このような理由からサーバサイドが好まれる傾向にあります。
Java言語で第三者のライブラリを利用する標準的な手段は、Apache Maven [3] (以下、Maven)を利用することです。Maven は主にJava言語で書かれたプログラムのコンパイル・テスト・配布等を自動化するためのツールです。特徴として、数行程度の設定ファイルの記述を行うことで、第三者のライブラリを自身のプロジェクトで利用できる機能があります。開発したライブラリをインターネット上(あるいは社内の)リポジトリで公開する機能も含まれます。
Mavenを利用してライブラリを公開するには、開発者はまずJava言語でライブラリを開発して、ライブラリの配布単位であるJARファイルを作成します。JARファイルの中にはJavaバイトコード形式でライブラリが格納されています。そして、POM(Project Object Model)というライブラリ管理用のデータをXML形式で記述します。POMファイルには、次の情報が含まれます。
- 開発者のグループ名
- ライブラリ名(成果物名)
- バージョン番号
- ビルド及びコンパイルのための情報
- 依存情報(依存している外部ライブラリの一覧)
JARファイルとPOMファイルを一つの組としてMavenリポジトリサイトに登録することで、ライブラリの公開が完了します。
POMファイルで重要な点は、あるライブラリが別のどんなライブラリに依存しているのか、という依存情報が管理できる点です。Mavenが主流になる以前は、この依存関係の管理が自動化されておらず、あるライブラリが依存しているライブラリを一つずつ手作業で配備するという手間が必要でした。POMファイルの依存情報とMavenの依存管理機能によって、現在ではライブラリの依存関係の解決の大部分が自動化できます。
Java言語のオープンソースのライブラリに関して言えば、かなりの本数のライブラリが既にMavenの公開リポジトリで共有されています。例えば、検索サイトmvnrepositoryでは(同一ライブラリの複数のバージョンを含めて)延べ25万本以上のライブラリが提供されています。別の言い方をすると、開発者がアプリケーションを開発する際に欲しいと考える機能の多くは既に実装されており、再利用しやすい形で公開されています。
一般的にソフトウェアの開発では、すべてを一人で開発するのではなく、複数の開発者が協調作業を行いながら、一つの作品としてソフトウェアを完成させます。協調作業には、開発チームのメンバと分業することも含まれますし、別の開発チームの成果物を再利用し、必要ならば修正を行って、修正結果をフィードバックするという広い意味の協調作業も含まれます。後者の意味の協調作業を支援する仕組みを重視してきたことがオープンソースソフトウェアの発展の鍵になっています。Java言語の場合、このような協調作業を支援するための標準的なツールがMavenです。
Mavenリポジトリに蓄積されているライブラリはJava言語の開発者コミュニティが長年培ってきた共有資産です。この共有資産の恩恵をエンドユーザにうまく還元することを考えると、サーバサイドアプリケーションだけにこだわるのは理想的ではありません。今後の展開としては、クライアントサイドアプリケーションでも、エンドユーザがMavenリポジトリに蓄積されているライブラリやアプリケーションをいつでもすぐに活用できる状態を実現するとよいでしょう。Mavenの依存管理機能をより使いやすくする目的で作られたApache Ivyプロジェクトがその端緒となると期待しています。
- [1] Maven Central Search Engine, http://search.maven.org/
- [2] mvnrepository, http://mvnrepository.com/
- [3] Apache Maven, http://maven.apache.org/
- [4] Apache Ivy, http://ant.apache.org/ivy/