Maven 入門 | 独自ライブラリの開発と利用 | 独自ライブラリプロジェクトの作成

Maven は中央リポジトリからライブラリを自動的にダウンロードして使用できる。では、利用できるのは中央リポジトリに登録されているものだけなのか、という疑問が生じる。

しかし、そうではない。自分で作成したライブラリをプロジェクトから参照して利用することも、もちろん可能である。

ライブラリプロジェクトの作成

では実際に簡単なライブラリを作成し、それを利用してみよう。ここでは例として “mylib” というライブラリプロジェクトを作成する。次のようにコマンドを実行し、Project の設定情報を入力して生成する。

Project 作成コマンド

$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart

入力情報

  • グループ ID: com.devkuma.mylib
  • アーティファクト ID: MyLib
  • バージョン: 1.0-SNAPSHOT (デフォルト)
  • パッケージ: com.devkuma.mylib (デフォルト)

プロジェクトが生成されたら、そこに簡単な処理を行うクラスを追加し、ライブラリとして使用する。

テンプレートとして maven-archetype-quickstart を指定したため、このプロジェクトは非常に一般的な Java アプリケーションプロジェクトである。ライブラリだからといって、何か特別なものがあるわけではない。

MyLib.java の作成

標準では App.java というクラスが用意されているが、これはアプリケーションとして使用するメインクラスとして利用する。これとは別に、ライブラリ用のクラスを作成する。

Project の中の /src/main/java/com/devkuma/mylib/ フォルダに、“MyLib.java” という名前で Java ソースコードファイルを作成する。そして次のように記述する。

package com.devkuma.mylib;
 
import java.util.*;
 
public class MyLib {
    private List<Integer> data = new ArrayList<Integer>();
 
    public MyLib(Integer...n){
        super();
        data = Arrays.asList(n);
    }
 
    public void add(int n){
        data.add(n);
    }
 
    public int getTotal(){
        int num = 0;
        for(int n:data){
            num += n;
        }
        return num;
    }
 
    @Override
    public String toString(){
        String res = "{data:[";
        for(int n:data){
            res += n + ", ";
        }
        res += "]}";
        return res;
    }
}

ここでは、いくつかの整数を List に集め、その合計を表示するメソッドを提供している。平凡ではあるが、ライブラリの動作を確認する程度としては十分である。

pom.xml はひとまず基本状態のままにしておく。ライブラリとはいっても、プロジェクト自体は当然ながら Java アプリケーションなので、特別なものは必要ない。

App.java の修正

作成した MyLib クラスを実際に使ってみよう。標準で用意されている App.java を開き、次のようにソースコードを記述する。そしてビルドしてアプリケーションを実行してみる。

package com.devkuma.mylib;
 
public class App {
 
    public static void main( String[] args )    {
        MyLib lib = new MyLib(10, 20, 30, 40);
        System.out.println("MyLib " + lib);
        System.out.println("total " + lib.getTotal());
    }
}

パッケージ作成

$ mvn package

パッケージを使って App クラスを実行

$ java -classpath target\MyLib-1.0-SNAPSHOT.jar com.devkuma.mylib.App

実行すると、次のようにコンソールに出力される。App クラスから MyLib クラスを作成して利用した結果である。

MyLib {data : 10, 20, 30, 40,]}
total 100

まずは MyLib の機能が正しく動作していることを確認できた。

ローカルリポジトリへのインストール

これでパッケージは完成するが、このままでは MyLib を他のプロジェクトで使用できない。使用しようとしても、リポジトリに MyLib が用意されていないためである。

リポジトリとは、ライブラリが登録されている場所である。最も広く使われているのは中央リポジトリだが、それ以外にもローカル環境にリポジトリが用意されている。これを「ローカルリポジトリ」と呼ぶ。

ローカルリポジトリは、ユーザーフォルダの .m2 フォルダに配置される。

/Users/{ユーザーフォルダ}/.m2

自分で作成したライブラリを使用したい場合は、このローカルリポジトリにライブラリを追加すれば、それを他のプロジェクトから参照して使用できる。ここでは次のように実行する。

$ mvn install

このコマンドは、ローカルリポジトリにパッケージをインストールするものである。これで MyLib がローカルリポジトリに追加され、他のプロジェクトから参照できるようになった。

SampleMavenApp で使用する

作成した MyLib を別のプログラムで使ってみよう。ここでは、これまでサンプルとして使ってきた SampleMavenApp プロジェクトの中で利用してみる。以下に App.java のサンプルコードを示す。

package com.devkuma;
 
import com.devkuma.MyLib;
 
public class App {
     
    public static void main( String[] args ){
        MyLib lib = new MyLib(123, 456, 78, 90);
        System.out.println("total " + lib.getTotal());
        System.out.println(lib);
    }
}

SampleMavenApp 内で MyLib を利用するには、MyLib を依存ライブラリとしてプロジェクトに登録する。これは pom.xml の <dependencies> タグ内に MyLib の設定を追加すればよい。

<dependency>
    <groupId>com.devkuma.mylib</groupId>
    <artifactId>MyLib</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

これが MyLib の <dependency> タグである。このタグを pom.xml の <dependencies> に追加する。

動作確認

ではプログラムが正しく動作するか確認する。まずアプリケーションをパッケージする。

$ mvn package

これで Jar ファイルが生成された。続いてプログラムを実行し、動作を確認してみる。

mvn exec:java

SampleMavenApp には exec-maven-plugin プラグインの設定を書いているため、exec:java で App クラスを実行できる。詳しくは Java アプリケーション開発 を参照。

これでひとまず外部ライブラリを使用できるようになった。ただし、まだ完全ではない。通常の java コマンドを使って実行してみよう。

$ java -classpath target\SampleMavenApp-1.0.jar com.devkuma.App

これではプログラムが実行されず、エラーが発生する。これはなぜだろうか。java コマンドでは実行できないのだろうか。理由は、ライブラリが入っていないためである。

mvn package によって target に保存される Jar ファイルには、実は MyLib のクラスは含まれていない。SampleMavenApp プロジェクトのクラスだけが入っている。exec:java で実行できたのは、ローカルリポジトリにあるライブラリを参照するようになっていたためである。

それに対して、通常の java コマンドはローカルリポジトリを参照しない。そのため、MyLib の Jar ファイルを Java や JDK の lib フォルダにコピーしなければ使用できない。

より確実なのは、MyLib も一緒に Jar ファイルに含めることである。含める方法については maven-assembly-plugin を参照してほしい。