#pragma section-numbers off [[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機能をもったサーバを用意すればよいでしょう。 = URL = http://maven.apache.org/ 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が読めない場合は以下の画像で理解してください。 [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翻訳] = Maven FAQ = == XDocletとの連携 == http://orinoco.flamefew.net/moatas/archives/000115.html = 参考サイト = 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://goas.no-ip.org/~koichiro/diary/20030520.html http://radio.weblogs.com/0112098/stories/2003/02/12/usingEclipseAndMaven.html = 注:Maven 1.0-Beta9での問題の解決法 = http://nagoya.apache.org/wiki/apachewiki.cgi?BrokenManifestInBeta9 = 参考 = 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