CLOVER🍀

That was when it all began.

Apache Mavenことはじめ

あまり個人的に積極的には使う理由がない…というかそれほど興味はないのですが、一応知っておいた方がいいのかな〜ってことで、ちょっとApache Mavenを使ってみることにしました。一応標準に近い位置にいますし、Scalaで使っているsbtも似たような動きをするので、知っておいてもいいかなーと。
※仕事では、Apache Antを使っている方が多いです。

そもそもMavenって何?という話ですが、Apache Antに代わるものとして作られたビルドプロセスを含めたプロジェクト管理ツールです。ビルドに留まらず、パッケージング、デプロイ、テスト、依存性の管理、プロジェクトサイトの生成などいろんなことができるけっこう壮大なソフトウェアになっています。Javaのだいたいのプロジェクトは、ビルドにAntかMavenを使っていると思うので、両方知ってると安心?

それはさておき、まずはインストールから。Mavenのサイトよりアーカイブをダウンロードして、適当な場所に配置。

Maven公式
http://maven.apache.org/
Mavenダウンロード
http://maven.apache.org/download.html
Mavenインストール手順
http://maven.apache.org/download.html#Installation

CentOSなのでtar.gzをダウンロードして展開。

$ tar -zxvf apache-maven-3.0.3-bin.tar.gz 

んで、/usr/localに配置。

# cd /usr/local
# mkdir apache-maven
# cd apache-maven
# mv [Mavenを解凍したディレクトリ] ./.
# ln -s apache-maven-3.0.3 current

個人的な趣向に則り、現在のバージョンをcurrentとエイリアス。

次いで、.bashrcに環境変数M2_HOMEとM2を設定し、パスを通します。

export M2_HOME=/usr/local/apache-maven/current
export M2=${M2_HOME}/bin
PATH=${M2}:${PATH}

なんでM2_HOMEとM2の2つが必要なのかは、今は知りません…。

動作確認。

$ mvn --version
Apache Maven 3.0.3 (r1075438; 2011-03-01 02:31:09+0900)
Maven home: /usr/local/apache-maven/current
Java version: 1.6.0_24, vendor: Sun Microsystems Inc.
Java home: /usr/java/jdk1.6.0_24/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "2.6.18-238.9.1.el5", arch: "amd64", family: "unix"

インストール完了!

次に、プロジェクトを作ってみましょう。

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

上記手順を参考に、

$ mvn archetype:generate -DgroupId=myapp.hello -DartifactId=myapp-hello -DinteractiveMode=false
[INFO] Scanning for projects...
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom (5 KB at 1.7 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-plugins/18/maven-plugins-18.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-plugins/18/maven-plugins-18.pom (13 KB at 27.3 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-parent/16/maven-parent-16.pom
…以下、延々と処理が続く

Mavenのarchetypeプラグインを使用し、プロジェクトを作成します。これにはgenerateゴールを利用します(書籍やサイトでよく紹介されている、createゴールは現在は非推奨です!)。なお、このコマンドを実行すると大量のファイルをインターネットからダウンロードしてきます。

よって、インターネットに繋がっていないと処理に失敗します。プロキシが必要な場合は、以下を参考にプロキシの設定をしてください。

Mavenのプロキシ設定。
http://maven.apache.org/guides/mini/guide-proxies.html
※$HOMEの.m2/settings.xmlに設定します

以下のように「BUILD SUCCESS」と表示されれば、完了です。

[INFO] project created from Old (1.x) Archetype in dir: /xxxxx/myapp-hello
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.494s
[INFO] Finished at: Wed May 18 22:00:11 JST 2011
[INFO] Final Memory: 8M/108M
[INFO] ------------------------------------------------------------------------

カレントディレクトリに「myapp-hello」というディレクトリができているので、そちらへ移動。

$ ll
合計 4
drwxrwxr-x 3 xxxxx xxxxx 4096  5月 18 22:00 myapp-hello
$ cd myapp-hello/
$ ll
合計 8
-rw-rw-r-- 1 xxxxx xxxxx  646  5月 18 22:00 pom.xml
drwxrwxr-x 4 xxxxx xxxxx 4096  5月 18 22:00 src

Mavenの標準ディレクトリ構成は、調べるとすぐに出てくると思いますが、とりあえず公式を貼っておきます。
http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

なお、このコマンドでできあがったpom.xmlは、こんなやつです。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>myapp.hello</groupId>
  <artifactId>myapp-hello</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>myapp-hello</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

archetypeプラグインの引数に指定したgroupId、artifactIdが現れていますね。groupIdはパッケージ名、artifactIdは最終的にできあがる成果物の名前に影響すると思っていれば、とりあえずOK?

一応、できあがったディレクトリとファイル。

$ find ./
./
./src
./src/test
./src/test/java
./src/test/java/myapp
./src/test/java/myapp/hello
./src/test/java/myapp/hello/AppTest.java
./src/main
./src/main/java
./src/main/java/myapp
./src/main/java/myapp/hello
./src/main/java/myapp/hello/App.java
./pom.xml

サンプル的に、2つのJavaファイルが置かれています。

ちなみに、置かれているApp.java

package myapp.hello;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

「Hello World」と出るらしいです。んじゃ、コンパイルして実行してみましょう。

以下のコマンドを実行します。

$ mvn package
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp-hello 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.4.3/maven-resources-plugin-2.4.3.pom
Downloaded: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.4.3/maven-resources-plugin-2.4.3.pom (6 KB at 7.0 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.4.3/maven-resources-plugin-2.4.3.jar
…以下、延々と処理が続く

って、やっぱりインターネットから関連するJARファイルのダウンロードが始まります。初回だけとはいえ、ちょっと鬱陶しい…。

以下のような表記が出れば、終了です。

[INFO] Building jar: /xxxxx/myapp-hello/target/myapp-hello-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:05.761s
[INFO] Finished at: Wed May 18 22:14:08 JST 2011
[INFO] Final Memory: 10M/67M
[INFO] ------------------------------------------------------------------------

「myapp-hello-1.0-SNAPSHOT.jar」って名前のJARファイルができたらしいですよ。なお、出力先として「target」というディレクトリができているはずです。

それでは、実行してみます。

$ java -cp target/myapp-hello-1.0-SNAPSHOT.jar myapp.hello.App
Hello World!

動きましたね!