いつかMavenと呼ばれたい@Wiki

はじめの第一歩

最終更新:

匿名ユーザー

- view
メンバー限定 登録/ログイン

はじめの第一歩


なにはともあれMavenでプロジェクトビルドを体験してみましょう。

適当なディレクトリを作ってください。

F:\gaoqiao1>mkdir my-app

F:\gaoqiao1>cd my-app


はじめてのプロジェクト作成

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

F:\gaoqiao1\my-app>mvn archetype:create \
-DgroupId=com.mycompany.app -DartifactId=my-jar

このコマンドは、archetypeプラグインのcreateゴールを使ってプロジェクトの雛型を作ります。
archetype(アーキタイプ)とは「原型」という意味で、プロジェクトテンプレートのことを言います。アーティファクト(Artifact:ビルド成果物)の種類(JAR、WAR、EAR、Mavenプラグイン等)に対応したアーキタイプが各種用意されています。archetypeプラグインのcreateゴールはデフォルトでJARアーティファクト用のプロジェクトを出力します。

Mavenのプロジェクトは必ず一意のグループIDアーティファクトIDを持ちます。ここではグループIDにcom.mycompany.app、アーティファクトIDにmy-jarを指定しています。

このコマンドの最初の実行には結構時間がかかります。というのも、このプラグイン・ゴールを実行するのに必要なライブラリがリモートリポジトリからローカルリポジトリにダウンロードされるためです。
ローカルリポジトリは%HOMEPATH%\.m2\repositoryに作られます。

プロジェクトのディレクトリ構成

コマンドの実行が終了すると、アーティファクトIDと同じmy-jarというディレクトリが作成されます。その下は以下の構成になっています。

└─my-jar
  │ pom.xml
  │
  └─src
    ├─main
    │ └─java
    │   └─com
    │     └─mycompany
    │       └─app
    │           App.java
    │
    └─test
      └─java
        └─com
          └─mycompany
            └─app
                AppTest.java

  • pom.xml
Mavenのビルドファイルで、Antのbuild.xmlに相当します。
pom.xmlのpomとはProject Object Modelの略で、まさにMavenプロジェクトをモデル化したものになります。
最 初に出力された段階では、グループID、アーティファクトID、バージョン番号、プロジェクト名といったプロジェクトの素性を表す情報、そしてこのプロ ジェクトが依存するライブラリ情報(dependenciesタグで指定。依存先ライブラリもグループID、アーティファクトIDを持ち、Mavenアー ティファクトとして管理されていることに注意)などが記述されているだけです。
一方、ビルド方法については一切記述されていません。
たったこれだけのビルドファイルでビルドできてしまうのが、Mavenの大きな特徴の一つです。
(※逆にこのシンプルさが、Mavenは何をしてくれるのかわからない・・・というとっつきにくさにもつながっているのかもしれません)

  • src
アーティファクト出力の根源(ソース)、すなわちアーティファクトを出力するのに必要なものは全てsrcディレクトリ配下に置かれます。

  • src\main、src\test
src直下のディレクトリは大きく2つに分かれます。アーティファクト出力に直接関係のあるものはmainディレクトリに、アーティファクト出力に直接関係しないもの(テスト用コード、プロジェクトサイト用コードなど)はその他のディレクトリに置かれます。
このサンプルではmain以下にJavaソースコード、テスト用コードがtestディレクトリに置かれます。

Mavenではプロジェクトの標準ディレクトリ構成が決められています。
この標準は先人の経験から出されたベストプラクティスであり、このおかげでプロジェクトの可搬性が上がり、プラグインもデフォルト設定のまま簡単に再利用できます。
標準以外の構成をカスタマイズすることも可能ですが、よっぽどの理由がない限りあまりメリットはないでしょう。

プロジェクトのビルド

Mavenでビルドをするにはpackageゴールを使います。

F:\gaoqiao1\my-app\my-jar>mvn package

コンソールに出力されるメッセージを観察していると、コンパイルが行われてからテストが実行されて、最後にJARパッケージが作成されるのがわかります。このようにpackageゴールは複数のビルドフェーズをまとめて実行します。このビルドフェーズのまとまりのことをビルド・ライフサイクル(Build Lifecycle)といいます。ビルド・ライフサイクルについては別の機会(未完)に紹介します。
packageゴールが終了すると、以下のようなディレクトリ構成になります。

└─my-jar
  │ pom.xml
  │
  ├─src
  │ ├─main
  │ │ └─java
  │ │   └─com
  │ │     └─mycompany
  │ │       └─app
  │ │           App.java
  │ │
  │ └─test
  │   └─java
  │     └─com
  │       └─mycompany
  │         └─app
  │             AppTest.java
  │
  └─target
    │ exported-pom.xml
    │ my-jar-1.0-SNAPSHOT.jar
    │
    ├─classes
    │ └─com
    │   └─mycompany
    │     └─app
    │         App.class
    │
    ├─surefire-reports
    │   com.mycompany.app.AppTest.txt
    │   TEST-com.mycompany.app.AppTest.xml
    │
    └─test-classes
      └─com
        └─mycompany
          └─app
              AppTest.class

アーティファクト(ここではmy-jar-1.0-SNAPSHOT.jar)はtargetディレクトリに出力されます。これも標準ディレクトリ構成として決められています。

MavenでWEBアプリケーションを開発する

WEBアプリケーション用のアーキタイプを使って、WEBアプリケーションのプロジェクトの雛型を作ります。

F:\gaoqiao1\my-app>mvn archetype:create \
-DgroupId=com.mycompany.app \
-DartifactId=my-webapp \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp


最後の2つの引数でWEBアプリケーション用アーキタイプを指定しています。

プロジェクトのディレクトリ構成は以下のようになっています。

└─my-webapp
  │ pom.xml
  │
  └─src
    └─main
      ├─resources
      └─webapp
        │ index.jsp
        │
        └─WEB-INF
            web.xml

src\main直下にwebappというディレクトリが置かれています。
また、雛型ですのでサーブレットなどのJavaコードは含まれていません。標準ディレクトリ構成にしたがって、src\main\javaの下にJavaコードを置いてください。

さきほどと同様にpackageゴールでビルドすると、targetディレクトリにmy-webapp.warという名前でWEBアプリケーションが出力されます。

F:\gaoqiao1\my-app\my-webapp>mvn package

複数のサブプロジェクトで構成されるプロジェクト

my-webappプロジェクトとmy-jarプロジェクトから構成されるmy-appプロジェクトを考えてみましょう。それぞれのプロジェクトの依存関係は以下の通りです。




1.my-jarディレクトリのpom.xmlをmy-app直下にコピーしてください。

2.コピーした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>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</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>
<modules>
 <module>my-jar</module>
 <module>my-webapp</module>
</modules>
</project>

  • artifactidをmy-jarからmy-appに変更
  • packagingをjarからpomに変更
  • modulesセクションを上記サンプルのように追加

3.my-jarプロジェクトの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">
<parent>
 <groupId>com.mycompany.app</groupId>
 <artifactId>my-app</artifactId>
 <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-jar</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</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>

  • parentセクションを上記サンプルのように追加

POMは親POMで定義された設定を継承することができます。この機能はとても強力なもので、プロジェクトの共通設定を親POMに記述しておくことによって、プロジェクト全体をコントロールすることができます。(親POMの応用例は、都度紹介していきます。)

4.my-webappプロジェクトの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">
<parent>
 <groupId>com.mycompany.app</groupId>
 <artifactId>my-app</artifactId>
 <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Webapp Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
  <dependency>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-jar</artifactId>
  <version>1.0-SNAPSHOT</version>
  <type>jar</type>
  </dependency>
</dependencies>
<build>
  <finalName>my-webapp</finalName>
</build>
</project>

  • parentセクションを上記サンプルのように追加
  • dependencyセクションにmy-jarプロジェクトへの依存関係を追加

これらのプロジェクトをビルドするために、my-appディレクトリでpackageゴールを実行します。

F:\gaoqiao1\my-app>mvn package

コンソールのメッセージからmy-jar→my-webappの順にビルドされていくのがわかります。
my -webapp\target\my-webapp.warを解凍して、パッケージの中身を確認してください。WEB-INF\libの下に、my- jarプロジェクトのアーティファクトであるmy-jar-1.0-SNAPSHOT.jarが、いっしょにパッケージングされているのを確認できるはず です。

プロジェクトのクリーン

プロジェクトをクリーンするにはcleanゴールを実行するだけです。

F:\gaoqiao1\my-app>mvn clean

さらに進めるために



目安箱バナー