#pragma section-numbers off

[["Maven2"]]

Software Design 2003年12月号の後での追記などもしています。(なかなか更新できてません)

= News =
2004/07/13: Maven 1.0 Released[[BR]]
2004/05/21: Maven 1.0 RC3 Released[[BR]]
2004/03/24: Maven 1.0 RC2 released[[BR]]
2003/11/18: Software Design 2003年12月号発売[[BR]]
2003/09/30: Maven 1.0 RC1 released[[BR]]
2003/07/15: Maven 1.0 Beta 10 released[[BR]]
2003/02/某: このページ作成日は2月より前のはず、、
----
[[TableOfContents]]
----

= 概要 =
Jakartaプロジェクトの一つ。

project object model (POM)に基礎を置いているbuildツールです。

Antと比較して以下のような特徴があります。

 * buildに必要なJarを(ほぼ)自動的に取得する
 * ある一定のGoal(Antでいうtarget)が最初から規定されている
 * Plug-in機能によりGoalを増加させる事ができる

という物です。

Mavenで初期状態でいくつかのPlug-inによりGoalが用意されていますので、["Ant"]のようにtargetのすべてを記述する必要はありません。

{{{
maven war:war
}}}
とすればwar Plug-inによりwarが作成されます。

ただし、これはすべてが自動的というわけではなく、["Ant"]のbuild.xmlにあたる、project.xmlが必要になります。

しかし、targetを書く必要はないため飛躍的にその記述量は軽減できます。
{{{
maven -g
}}}
にて利用可能なGoalが一覧表示されます。

buildに必要なJarを(ほぼ)自動的に取得する機能に関しては、取得先を変更する事も可能なので、プロジェクトなどで利用する場合はプロジェクト専用サーバを設置しておくとよいでしょう。

プロジェクト専用サーバの機能としてはWebサーバ機能、CVS、メーリングリスト、["Scarab"]によるtracking System機能をもったサーバを用意すればよいでしょう。またGUMPと連携させるのが強力でよいでしょう。

= URL =
http://maven.apache.org/

http://maven-plugins.sourceforge.net/

http://wiki.codehaus.org/maven/

http://www.mavenblogs.com/

http://repo1.maven.org/maven2/

[http://www.eisbahn.jp/yoichiro/2007/02/maven2site.html 天使やカイザーと呼ばれて: maven2のsiteゴールによるレポートの出力]

= インストール =
Maven 1.0 RC2 の仕様を補足中。

== ダウンロード ==
http://maven.apache.org/start/download.html

よりmaven-1.0-rc2をダウンロード。解凍して任意のフォルダにおきます。

== インストール ==
{{{$HOME/.bashrc}}}などの初期設定ファイルや{{{$HOME/.mavenrc}}}に
{{{
MAVEN_HOME=解凍したmavenの位置
export MAVEN_HOME
}}}
を設定

{{{
${MAVEN_HOME}/bin/maven -v
}}}
で起動してみます。

バージョン表示が見れたら成功です。

{{{${MAVEN_HOME}/bin}}}にPathを通しておくと以後の運用が楽になります。

= プロジェクト作成 =
とりあえずはじめるなら。
{{{
maven genapp
}}}

以下の4つの質問がでます。
{{{
Enter a project template to use: [default]
Please specify an id for your application:  [app]
Please specify a name for your application:  [Example Application]
Please specify the package for your application:  [default.example.app]
}}}

デフォルトのままのpackage名だとコンパイル失敗します。ちゃんとpackage名付加してください。

== project.xml ==
project.xml とは["Ant"]の build.xml にあたる物です。genappで作成された物を基本に修正する事からはじめると良いでしょう。

http://maven.apache.org/start/integrate.html

http://maven.apache.org/reference/project-descriptor.html

project.xmlの定義は

http://cvs.apache.org/viewcvs.cgi/maven/src/xsd/maven-project.xsd

に存在します。["XMLSchema"]です。DTDでないので注意してください。

XMLSchemaが読めない場合は以下の画像で理解してください。

[http://maven.apache.org/images/project-descriptor.gif](現在行方不明)

かなり最小限のproject.xml
{{{
<?xml version="1.0" encoding="UTF-8"?>

<project>
  <id>Testsample</id>
  <name>Sample</name>
  <currentVersion>0.0.1</currentVersion>

  <build>
    <sourceDirectory>src/main</sourceDirectory>
    <unitTestSourceDirectory>src/test</unitTestSourceDirectory>
  </build>

  <dependencies>
    <dependency>
      <id>ant</id>
      <version>1.5.1</version>
    </dependency>

    <dependency>
      <id>junit</id>
      <version>3.8.1</version>
    </dependency>
  </dependencies>

</project>
}}}

= 利用方法 =
[http://maven.apache.org/reference/user-guide.html Maven User Guide]
に記述がある。

ここではUser Guideより重要な部分を抜粋して記述する。

== 設定ファイル ==
Properties Processingの項に説明がある。
{{{
${maven.home}/bin/driver.properties
${project.home}/project.properties
${project.home}/build.properties
${user.home}/build.properties
}}}
最後に読み込んだファイルの設定が優先されます。

== Repository ==
RepositoryというのはMavenがJarをダウンロードする位置です。Mavenは利用するJarを(ほぼ)自動的に取得します。

Repositoryの位置は
{{{
maven.repo.local
}}}
の設定をpropertiesファイルに記述する事で指定可能です。デフォルトでは、
{{{
${MAVEN_HOME}/repository
}}}
になります。

== 依存関係 ==
開発において各種Jarを利用しますが、そのバージョンをDependenciesとしてproject.xml内に規定できます。
{{{
<dependencies>
  <dependency>
    <id>ant</id>
    <version>1.5.1</version>
  </dependency>
</dependencies>
}}}
以上の場合はant1.5.1を利用するという事になります。

== プロジェクトWeb ==
{{{
maven site:generate
}}}
で作成する事が可能です。

== warの作成 ==
http://maven.apache.org/reference/plugins/war/properties.html

を参考にpropertyを設定します。

一部の動作がまだ不便です。

= Plug-in =
各機能は{{{Plug-in}}}により実装されています。{{{Plug-in}}}の動作もpropertiesファイル内で設定できます。

{{{Plug-in}}}の設定可能なpropertiesは以下を参照してください。

http://maven.apache.org/reference/plugins/index.html

== Plug-in作成手順 ==
プラグインを作成する場合は既存のプラグインを参照するのが現状ではもっとも早いでしょう。

plugin.jellyというファイルがほとんどの場合中心です。

["Jelly"]のドキュメントは以下にあります。

[http://jakarta.apache.org/commons/jelly/ JakartaJelly]

[http://jakarta.terra-intl.com/commons/jelly/ Jakartaの杜JakartaJelly翻訳]

= GUMPとの連携 =
まだ記載してません。

= Scarabとの連携 =
設定により自動連携が可能です。

= Maven FAQ =
== XDocletとの連携 ==
http://orinoco.flamefew.net/moatas/archives/000115.html

== 注:Maven 1.0-Beta9での問題の解決法 ==
http://nagoya.apache.org/wiki/apachewiki.cgi?BrokenManifestInBeta9

= 参考サイト =
[http://cvs.peopleware.be/training/maven/maven2/ Maven 2]

[http://www.javaworld.com/javaworld/jw-02-2006/jw-0227-maven.html Get the most out of Maven 2 site generation]

http://homepage2.nifty.com/ymagic/javaworld/

http://www-6.ibm.com/jp/developerworks/java/030613/j_j-maven.html

http://www.ingrid.org/jajakarta/turbine/jp/turbine/maven/

http://www.02.246.ne.jp/~torutk/maven/

http://www.javaworld.com/javaworld/jw-10-2002/jw-1011-maven.html

http://ko.meadowy.net/~koichiro/diary/20030520.html#p02

[http://codezine.jp/a/article.aspx?aid=177 プログラミング・開発者・ソースコード CodeZine:Mavenを利用してオールインワンのプロジェクト環境を構築する(Java, ビルドツール, プロジェクト管理, XML)]

http://radio.weblogs.com/0112098/stories/2003/02/12/usingEclipseAndMaven.html

http://www.sunicom.co.jp/support/maven/

[http://www.mavenregistry.com/ mvnRegistry]

[http://www.mergere.com/m2book_download.jsp Mergere]:Maven2、Continuumについて書かれたフリーのPDF書籍

[http://codezine.jp/a/article/aid/715.aspx CodeZine:Apache MavenによるJavaプロジェクトポータビリティの向上(Maven, Apache, POM, ビルド, ライフサイクル管理)]

= 参考 =
project.xmlのDTD(注:このDTDは不完全です)
{{{
<!--
    Maven Project Descriptor Doctype Declaration
-->

<!ELEMENT project
  (extend?, pomVersion, id, name, groupId?, currentVersion, organization,
   inceptionYear, package?, logo?, gumpRepositoryId?, description?,
   shortDescription, url?, issueTrackingUrl?, siteAddress?, siteDirectory?,
   distributionDirectory?, repository?, versions?, branches?, mailingLists?,
   developers, contributors?, dependencies?, build, reports?)
>

<!ELEMENT extend (#PCDATA)>
<!ELEMENT pomVersion (#PCDATA)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT groupId (#PCDATA)>
<!ELEMENT currentVersion (#PCDATA)>
<!ELEMENT organization (name, url?, logo?)>
<!ELEMENT inceptionYear (#PCDATA)>
<!ELEMENT package (#PCDATA)>
<!ELEMENT logo (#PCDATA)>
<!ELEMENT gumpRepositoryId (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT shortDescription (#PCDATA)>
<!ELEMENT url (#PCDATA)>
<!ELEMENT issueTrackingUrl (#PCDATA)>
<!ELEMENT siteAddress (#PCDATA)>
<!ELEMENT siteDirectory (#PCDATA)>
<!ELEMENT distributionDirectory (#PCDATA)>
<!ELEMENT repository (#PCDATA)>
<!ELEMENT versions (#PCDATA)>
<!ELEMENT branches (branch*)>
<!ELEMENT mailingLists (mailingList*)>
<!ELEMENT developers (developer*)>
<!ELEMENT contributors (contributor*)>
<!ELEMENT dependencies (dependency*)>
<!ELEMENT build
          (nagEmailAddress?,
          sourceDirectory?,
          unitTestSourceDirectory?,
          integrationUnitTestSourceDirectory?,
          aspectSourceDirectory?,
          unitTest?,
          integrationUnitTest?,
          resources?)
>
<!ELEMENT reports (report*)>

<!--                    brances                                    -->
<!ELEMENT branch (tag)>
<!ELEMENT tag (#PCDATA)>

<!--                    mailingLists                               -->
<!ELEMENT mailingList (name, subscribe, unsubscribe, archive?)>
<!ELEMENT subscribe (#PCDATA)>
<!ELEMENT unsubscribe (#PCDATA)>
<!ELEMENT archive (#PCDATA)>

<!--                    developers                                 -->
<!ELEMENT developer (name, id, email, organization?, roles?, url?)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT organization (#PCDATA)>
<!ELEMENT roles (role*)>
<!ELEMENT role (#PCDATA)>

<!--                    contributors                               -->
<!ELEMENT contributor (name, email?, organization?, roles?, url?)>

<!--                    dependencies                               -->
<!ELEMENT dependency (id?, groupId?, artifactId?, version?,
          jar?, type?, url?)>
<!ELEMENT type (#PCDATA)>
<!ELEMENT jar (#PCDATA)>

<!--                    build                                      -->
<!ELEMENT nagEmailAddress (#PCDATA)>
<!ELEMENT sourceDirectory (#PCDATA)>
<!ELEMENT unitTestSourceDirectory (#PCDATA)>
<!ELEMENT integrationUnitTestSourceDirectory (#PCDATA)>
<!ELEMENT aspectSourceDirectory (#PCDATA)>
<!ELEMENT unitTest (includes*, excludes*)>
<!ELEMENT integrationUnitTest (includes*, excludes*)>
<!ELEMENT resources (resource*)>

<!--                    unitTest                                   -->
<!ELEMENT includes (include*)>
<!ELEMENT include (#PCDATA)>
<!ELEMENT excludes (exclude*)>
<!ELEMENT exclude (#PCDATA)>

<!--                    resources                                  -->
<!ELEMENT resource (directory?, targetPath?, includes*, excludes*)>
<!ELEMENT directory (#PCDATA)>
<!ELEMENT targetPath (#PCDATA)>

<!--                    reports                                    -->
<!ELEMENT report (#PCDATA)>

}}}
----
CategoryJava