Maven
Software Design 2003年12月号の後での追記などもしています。(なかなか更新できてません)
News
2004/07/13: Maven 1.0 Released 2004/05/21: Maven1.0 RC3 Released 2004/03/24: Maven 1.0 RC2 released 2003/11/18: Software Design2003年12月号発売 2003/09/30: Maven 1.0 RC1 released 2003/07/15: Maven 1.0 Beta 10released 2003/02/某:このページ作成日は2月より前のはず、、
目次
概要
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-plugins.sourceforge.net/
http://wiki.codehaus.org/maven/
http://repo1.maven.org/maven2/
天使やカイザーと呼ばれて: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が読めない場合は以下の画像で理解してください。
1(現在行方不明)
かなり最小限の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>
利用方法
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のドキュメントは以下にあります。
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
参考サイト
Get the most out of Maven 2 sitegeneration
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
プログラミング・開発者・ソースコード CodeZine:Mavenを利用してオールインワンのプロジェクト環境を構築する(Java, ビルドツール, プロジェクト管理, XML)
http://radio.weblogs.com/0112098/stories/2003/02/12/usingEclipseAndMaven.html
http://www.sunicom.co.jp/support/maven/
Mergere:Maven2、Continuumについて書かれたフリーのPDF書籍
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)>
