Contents
概要
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機能をもったサーバを用意すればよいでしょう。
URL
http://maven-plugins.sourceforge.net/
インストール
http://maven.apache.org/start/download.html
よりmaven-1.0-beta-8.tar.gzもしくはmaven-1.0-beta-8.zipをダウンロード。解凍して任意のフォルダにおきます。
$HOME/.bashrcなどの初期設定ファイルや$HOME/.mavenrcに
MAVEN_HOME=解凍したmavenの位置 export MAVEN_HOME
を設定
${MAVEN_HOME}/bin/maven
で起動。
[ERROR] java.lang.Exception: The project.xml file you specified has a length of zero.
で起動エラーがおきたら成功です。
${MAVEN_HOME}/binにPathを通しておくと以後の運用が楽になります。
プロジェクト
project.xmlはAntにおけるbuild.xmlです。
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が読めない場合は以下の画像で理解してください。
かなり最小限の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のドキュメントは以下にあります。
Maven FAQ
XDocletとの連携
http://orinoco.flamefew.net/moatas/archives/000115.html
参考サイト
http://homepage2.nifty.com/ymagic/javaworld/
参考
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)>