playing with maven (1)

最近, 仕事で maven を使うことが多くなり, 自分でも色々触ってみたかったのでいじってみました.

(まだ雛形しか作ってませんが)

環境

maven のバージョンなどは以下の感じです. (まだ Lion にしてなかったや ^^;)

$ mvn --version
Apache Maven 3.0.3 (r1075438; 2011-03-01 02:31:09+0900)
Maven home: /usr/share/maven
Java version: 1.6.0_26, vendor: Apple Inc.
Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
Default locale: en_US, platform encoding: MacRoman
OS name: "mac os x", version: "10.6.8", arch: "x86_64", family: "mac"

maven plugin

せっかくなので maven plugin の作り方も勉強します.

http://www.slideshare.net/guestd4898b/maven2

ここに素晴しいスライド資料を見付けたので, これに沿って plugin プロジェクトを作成. maven のバージョンが 2 と 3 で違っていますが, そんなに大きな違いは無いようです. (maven の 1 と 2 では大違い, という話は伝え聞いていました.)

$ mvn archetype:create -DpackageName=net.elliptium.maven.plugins.sample -DgroupId=net.elliptium.maven.plugins -DartifactId=maven-sample-plugin -DarchetypeArtifactId=maven-archetype-mojo
$ cd maven-sample-plugin
$ mvn install

でプロジェクトを作成し, ローカルレポジトリに install します.

最初のプロジェクト作成のコマンドは少し長いですが, スライドの17枚目を見ていただくと理解できるかと思います.

packageName は Java の慣習に従って, このブログでも使っている私有のドメイン名を引っ繰り返したものの下にくるものを付けました. groupId も他人のものと区別できるように, 似た感じに付けました.

maven の素晴しいところは最初に雛形となるプロジェクトが作成され, 最低限の内容が記述されたソースコードと設定ファイルが出来上がるところです. Rails から始まった流儀なのかなぁ? となんとなく思っていますが, その思想は現在は Sphinx や PlayFramework など, 言語や分野の壁を越えて広まっています.

最初の一歩を踏み出す人には, 実際に動くサンプルソースから始めて, 少しずつそれを改造しながら進むのが一番と考えています. なので, この maven の思想には強く共感を覚えます.

さて, プロジェクトを作ったら, プロジェクトのディレクトリに入り最初のコンパイルをしましょう.

maven には build lifecycle という概念があって, 開発→コンパイル→テスト→出荷のような一連の開発の流れを管理しています. それぞれの1ステップのことを phase と呼ぶそうです.

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Build_Lifecycle_Basics

今回は install までやってしまうので, .class ファイルへのコンパイルをし, jar に固め, ローカルレポジトリに入れるところまで行います.

$ ls target/
maven-sample-plugin-1.0-SNAPSHOT.jar
$ ls ~/.m2/repository/net/elliptium/maven/plugins/maven-sample-plugin/1.0-SNAPSHOT/
maven-sample-plugin-1.0-SNAPSHOT.jar

plugin プロジェクトのディレクトリに居るものとして, 成果物の出力先である target ディレクトリの中を見ると .jar ファイルが出来上がっています. また maven のローカルリポジトリにも同じ .jar がコピーされています.

package するだけでなく install まで行なうと, 他のプロジェクトからもこの .jar ファイルが使えるようになり, plugin を使用することができます.

maven project

さて, 次はこの maven plugin を使う Java プロジェクトを作成しましょう. ここでも maven を使うことができます.

$ mvn archetype:generate -DgroupId=net.elliptium.java.sample -DartifactId=sample
$ cd sample
$ emacs pom.xml
// なんらかの方法で pom.xml を編集
$ cat 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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>net.elliptium.java.sample</groupId>
  <artifactId>sample</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>sample</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>net.elliptium.maven.plugins</groupId>
      <artifactId>maven-sample-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

dependency を追加して, こんな感じの pom.xml にします. groupId などは plugin を作成したときのものを指定しています.

(訂正. archetype:create は DEPRECATED と怒られたので, 新しい archetype:generate に直しました. 対話的にプロジェクトの設定値を聞かれますが, 基本的に空 Enter を打ってデフォルトのままにして良さそうです.)

この状態で

$ mvn package
$ ls target
sample-1.0-SNAPSHOT.jar

とやると無事コンパイルと .jar 化が終了して, target 以下に .jar が出来上がっています.

さっき自作した maven plugin を読みに行くのかを確かめたいところですが, ここで今までとはちょっと違うコマンドを打ちます.

$ mvn eclipse:eclipse
$ cat .classpath
<classpath>
  <classpathentry kind="src" path="src/test/java" output="target/test-classes" including="**/*.java"/>
  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
  <classpathentry kind="output" path="target/classes"/>
  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
  <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-api/2.0/maven-plugin-api-2.0.jar"/>
  <classpathentry kind="var" path="M2_REPO/net/elliptium/maven/plugins/maven-sample-plugin/1.0-SNAPSHOT/maven-sample-plugin-1.0-SNAPSHOT.jar"/>
  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>

これは今作っている Java プロジェクトを Eclipse で扱えるように eclipse 用の設定ファイル群 (.project, .classpath など) を生成しています. スライドの23枚目を参照すると何をしているか分かると思います.

.classpath というのは Eclipse が認識するクラスパスの設定です. ここを見ると無事, maven-sample-plugin-1.0-SNAPSHOT.jar を参照していることが分かります.

今回の作業はここまでにしておきます. また次回からはこの先の開発作業で maven を使うところをやっていきます.

まとめ

今回は

  • maven plugin project の作り方
  • plugin の install の方法
  • maven Java project の作り方
  • maven plugin を使用できるようにする設定方法

について書きました.

それでは.

Comments

blog comments powered by Disqus

Licenses