Dec 24, 2009

[Maven] Maven 2.x をオフラインで利用する方法

Maven 2.x をオフラインで利用する方法をメモ。

オフライン作業の準備

Maven は基本的にオンラインが前提なので、処理に必要なプラグインや依存するライブラリは必要になった都度ダウンロードを行う。 当然オフライン状態ではダウンロードは無理なので、オンライン状態で一度も実行していない処理をオフラインで実行すると必要なプラグインや依存するライブラリをダウンロードできず処理に失敗する可能性がある。 これを回避するため、Maven Dependency Plugin を使用して必要なプラグインや依存するライブラリを事前に全てダウンロードしておくと良い。

Maven Dependency Plugin - dependency:go-offline
http://maven.apache.org/plugins/maven-dependency-plugin/go-offline-mojo.html
$ mvn dependency:go-offline

一時的にオフラインモードにする

Maven を一時的にオフラインモードで使用する場合は起動時引数でオフラインモードを指定する。

$ mvn --offline package
もしくは
$ mvn -o package

永続的にオフラインモードにする

settings.xml でオフラインモードを指定すると、永続的にオフラインモードとすることができる。

Settings Reference
http://maven.apache.org/settings.html#Simple_Values
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <offline/>
</settings>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Dec 01, 2009

[Maven] Maven 3.0 リリース前情報まとめ

Maven 3.0-alpha がすごい勢いでリリースされている。 2009/11/13 に alpha-3、11/17 には alpha-4、11/27 には alpha-5 と立て続けに alpha 版が更新されている。 beta、正式リリースに備えてそろそろ情報をまとめておこう。

Maven 3.x 公式情報

Maven 3.0 では内部モジュール構成の見直し、依存性解決システムの刷新、IDE サポートの強化などが謳われている。 Apache Maven の WIKI に詳細情報がある。

Maven 3.x
http://cwiki.apache.org/MAVEN/maven-3x.html
Maven 3.x Plan
http://cwiki.apache.org/MAVEN/maven-3x-plan.html
Maven 3.x Compatibility Notes
http://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html
Maven 3.x Features
http://cwiki.apache.org/MAVEN/maven-3x-features.html
Maven 3.x and site plugin
http://cwiki.apache.org/MAVEN/maven-3x-and-site-plugin.html
Maven 3.x Class Loading
http://cwiki.apache.org/MAVEN/maven-3x-class-loading.html

Maven 3.x ダウンロード

2009/12/01 現在、3.0-alpha-5 が下記よりダウンロード可能。

Download Maven 3.0
http://maven.apache.org/download.html#Maven_3.0-alpha-5

Maven 3.x コードリポジトリ

Maven 3.x の最新のコードはこちら。

/maven/maven-3/trunk
https://svn.apache.org/repos/asf/maven/maven-3/trunk/

その他

Maven の主要開発者である Jason van Zyl 氏によるプレゼン資料。 Maven 3.0 の全体像を俯瞰するのにとても良い情報。

Jason's Maven 3 Presentation
http://www.scribd.com/doc/14458957/Jasons-Maven-3-Presentation


Groovy との連携。
Writing your pom files in Groovy - a sneek preview of Maven 3's polyglot features
http://www.wakaleo.com/blog/236-writing-your-pom-files-in-groovy-a-sneek-preview-of-maven-3s-polyglot-features

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Maven] Maven 3.0-alpha-5 で package にチャレンジ

試しに Maven 2.1 系で管理しているプロジェクトを Maven 3.0-alpha-5 で clean package してみた。

Maven 3.0-alpha-5 を Mac OS X Snow Leopard にインストール

$ wget http://ftp.riken.jp/net/apache/maven/binaries/apache-maven-3.0-alpha-5-bin.tar.gz
$ tar zxvf ./apache-maven-3.0-alpha-5-bin.tar.gz 
$ sudo mv ./apache-maven-3.0-alpha-5 /usr/share/java/
$ sudo chown -R root:wheel ./apache-maven-3.0-alpha-5
$ export MAVEN_HOME=/usr/share/java/apache-maven-3.0-alpha-5
$ export PATH=$MAVEN_HOME/bin:$PATH
$ mvn --version
Apache Maven 3.0-alpha-5 (r883378; 2009-11-24 00:53:41+0900)
Java version: 1.6.0_15
Java home: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
Default locale: ja_JP, platform encoding: SJIS
OS name: "mac os x" version: "10.6.2" arch: "x86_64" Family: "mac"
$ 

プロジェクトの clean package

全く何事もなく正常終了。 正直驚いた。 3.0 の売り文句通り、plugin 周りの後方互換性はかなり高そうだ。

$ mvn clean package
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building MyApp 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.4.1/maven-resources-plugin-2.4.1.jar
24 KB downloaded at 13.8 KB/sec
[INFO] 
[INFO] --- maven-clean-plugin:2.3:clean (default-clean) @ myapp ---
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.3/maven-clean-plugin-2.3.pom
5 KB downloaded at 24.6 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/shared/file-management/1.2.1/file-management-1.2.1.pom
4 KB downloaded at 21.4 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/shared/file-management/1.2.1/file-management-1.2.1.jar
37 KB downloaded at 14.0 KB/sec
[INFO] Deleting file set: /Users/me/Workspace/MyApp/target (included: [**], excluded: [])
[INFO] 
[INFO] --- maven-resources-plugin:2.4.1:resources (default-resources) @ myapp ---
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.4.1/maven-resources-plugin-2.4.1.pom
6 KB downloaded at 29.3 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/shared/maven-filtering/1.0-beta-3/maven-filtering-1.0-beta-3.pom
6 KB downloaded at 30.6 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-interpolation/1.12/plexus-interpolation-1.12.pom
889 B downloaded at 5.0 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-components/1.1.14/plexus-components-1.1.14.pom
6 KB downloaded at 32.8 KB/sec
Downloading: http://repo1.maven.org/maven2/org/sonatype/plexus/plexus-build-api/0.0.4/plexus-build-api-0.0.4.pom
3 KB downloaded at 16.1 KB/sec
Downloading: http://repo1.maven.org/maven2/org/sonatype/spice/spice-parent/10/spice-parent-10.pom
3 KB downloaded at 16.9 KB/sec
Downloading: http://repo1.maven.org/maven2/org/sonatype/forge/forge-parent/3/forge-parent-3.pom
5 KB downloaded at 28.2 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/1.5.8/plexus-utils-1.5.8.pom
8 KB downloaded at 45.3 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-interpolation/1.13/plexus-interpolation-1.13.pom
890 B downloaded at 1.5 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-components/1.1.15/plexus-components-1.1.15.pom
3 KB downloaded at 4.8 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus/2.0.3/plexus-2.0.3.pom
16 KB downloaded at 16.6 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/shared/maven-filtering/1.0-beta-3/maven-filtering-1.0-beta-3.jar
34 KB downloaded at 22.8 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-file/1.0-beta-2/wagon-file-1.0-beta-2.jar
10 KB downloaded at 10.3 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http-lightweight/1.0-beta-2/wagon-http-lightweight-1.0-beta-2.jar
13 KB downloaded at 11.4 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/wagon/wagon-http-shared/1.0-beta-2/wagon-http-shared-1.0-beta-2.jar
10 KB downloaded at 12.5 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-interpolation/1.13/plexus-interpolation-1.13.jar
60 KB downloaded at 9.7 KB/sec
Downloading: http://repo1.maven.org/maven2/org/sonatype/plexus/plexus-build-api/0.0.4/plexus-build-api-0.0.4.jar
7 KB downloaded at 10.4 KB/sec
[WARNING] Using platform encoding (SJIS actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 4 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.0.2:compile (default-compile) @ myapp ---
[INFO] Compiling 151 source files to /Users/me/Workspace/MyApp/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.4.1:testResources (default-testResources) @ myapp ---
[WARNING] Using platform encoding (SJIS actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/me/Workspace/MyApp/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.0.2:testCompile (default-testCompile) @ myapp ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.4.3:test (default-test) @ myapp ---
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.4.3/maven-surefire-plugin-2.4.3.pom
7 KB downloaded at 20.1 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire/2.4.3/surefire-2.4.3.pom
8 KB downloaded at 41.4 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.pom
2 KB downloaded at 11.4 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.pom
3 KB downloaded at 2.5 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/1.5.1/plexus-utils-1.5.1.pom
3 KB downloaded at 5.5 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-toolchain/1.0/maven-toolchain-1.0.pom
4 KB downloaded at 19.3 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar
262 KB downloaded at 28.0 KB/sec
Downloading: http://repo1.maven.org/maven2/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar
504 KB downloaded at 20.7 KB/sec
Downloading: http://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/1.5.1/plexus-utils-1.5.1.jar
206 KB downloaded at 27.7 KB/sec
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-jar-plugin:2.2:jar (default-jar) @ myapp ---
[INFO] Building jar: /Users/me/Workspace/MyApp/target/MyApp-1.0.0-SNAPSHOT.jar
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:30.739s
[INFO] Finished at: Tue Dec 01 06:37:14 JST 2009
[INFO] Final Memory: 11M/79M
[INFO] ------------------------------------------------------------------------
$ 

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 30, 2009

[Maven] Maven2 で依存するライブラリも jar に格納する方法

通常 Java のアプリケーションは複数の jar で構成されることが多い。 log4j、Jakarta Commons、・・・といったライブラリを普通に使うと数十の jar になってしまうこともしばしば。 Java Web Start を使わずに、jar を Web サーバ上に設置してダウンロード→ダブルクリックで実行、としたい場合など複数の jar に分かれていると困ることもある。 Maven2 では maven-shade-plugin を利用することで依存するライブラリも含んだ jar を作成することができる。

Maven Shade Plugin
http://maven.apache.org/plugins/maven-shade-plugin/index.html

maven-shade-plugin の使い方

pom.xml に下記を追記する。 <finalName> には生成する jar のファイル名を、<mainClass> には実行可能なクラスを指定する。

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <finalName>myapp</finalName>
              <transformers>
                <transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>jp.in_vitro.myapp.Main</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

package goal を指定して Maven2 を起動すると、指定したファイル名で dependencies を全て含んだ jar が生成される。

$ mvn clean package

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 15, 2009

[Maven] 続・Maven2 で JAR の Manifest ファイルを設定する方法をメモ

以前書いた「Maven2 で JAR の Manifest ファイルを設定する方法をメモ」というエントリの続き。 いつの間にやら 3.5 年も経過していたわけだが、その間に maven-archiver-plugin が MANIFEST.MF を更に柔軟に扱える様に進化していた様だ。

Maven Archiver
http://maven.apache.org/shared/maven-archiver/index.html

manifestEntries を使うことで、Implementation-Version、Implementation-Vendor 等を自由に指定できる。 これは嬉しい。

<archive>
  <addMavenDescriptor/>
  <compress/>
  <forced/>
  <index/>
  <manifest>
    <addClasspath/>
    <addDefaultImplementationEntries/>
    <addDefaultSpecificationEntries/>
    <addExtensions/>
    <classpathMavenRepositoryLayout/>
    <classpathPrefix/>
    <mainClass/>
    <packageName/>
  </manifest>
  <manifestEntries>
    <key>value</key>
  </manifestEntries>
  <manifestFile/>
  <manifestSections>
    <manifestSection>
      <name/>
      <manifestEntries>
        <key>value</key>
      </manifestEntries>
    <manifestSection/>
  </manifestSections>
  <pomPropertiesFile/>
</archive>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 14, 2009

[Maven] Maven2 管理のプロジェクトで依存するライブラリを集める方法

Maven2 で管理しているプロジェクトでは、Maven2 の機能で依存するライブラリを集めることができる。 war でパッケージングしているプロジェクトであれば maven-war-plugin が集めてくれるが、jar や pom の場合はアーカイブ作成時には集めてくれないので必要に応じて別途集めないといけない。 maven-dependency-plugin を使うと簡単に依存するライブラリを集めることができる。

Maven Dependency Plugin
http://maven.apache.org/plugins/maven-dependency-plugin/
dependency:copy-dependencies
http://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html

依存するライブラリの集め方

$ mvn dependency:copy-dependencies
上記コマンドを実行すると $PROJECT_JHOME/target/dependency に依存するライブラリがコピーされる。
その後、クラスパスを作りたければ
for i in `ls ./target/dependency/`; do printf ":./target/dependency/$i"; done; printf "\n"
といった感じで簡単に作成できる。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 01, 2009

[Maven] Maven 2.2.0 リリース!!

Maven 2.2.0 がリリースされた。動作環境を JDK 1.4 から 1.5 に引き上げたので、 2.1.1 というバージョンにならず 2.2.0 となった模様。 変更内容はバグフィックスがメイン。

Maven - Release Notes - Maven 2.2.0
http://maven.apache.org/release-notes.html
Maven - Download
http://maven.apache.org/download.html

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 23, 2009

[Maven] Maven Resource Plugin のワーニング

Maven 2.1.0 にしたら、Maven Resource Plugin でリソースのフィルタリングを行う際に以下のワーニングが出る様になった。

[INFO] [resources:resources]
[WARNING] File encoding has not been set, using platform encoding SJIS, i.e. build is platform dependent!
[WARNING] Using platform encoding (SJIS actually) to copy filtered resources, i.e. build is platform dependent!
対処方法は以下の 2 通り。

maven-resource-plugin の encoding を設定する方法

1 つ目の対処方法は maven-resource-plugin の encoding を設定するというもの。

<project>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <configuration>
            <encoding>UTF-8</encoding>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>
詳細は Maven Resource Plugin - resources:resources を参照のこと。

"project.build.sourceEncoding" プロパティを設定する方法

2 つ目の対処方法は pom.xml に "project.build.sourceEncoding" プロパティを設定するというもの。

<project>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>
"project.build.sourceEncoding" は多くのプラグインで参照されているので、設定する場合は多少注意が必要。 ちなみに、 "project.build.sourceEncoding" を参照するプラグインは以下の通り(全部ではない可能性大)。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 31, 2009

[Maven] Continuum と Apache HTTP Server + AJP 経由で呼び出す

Continuum は Jetty を内包しており、自前で Web サーバ機能を提供している。 今回は Apache HTTP Server から AJP 経由で Jetty を呼び出す方法をメモ。 使用した Continuum のバージョンは 1.2.3 で、同梱の Jetty は 6.1.11。

Continuum
http://continuum.apache.org/
Jetty
http://jetty.mortbay.com/jetty/

設定方法

既に Continuum 1.2.3 がインストールされており、起動可能な状態になっていることが前提。 Continuum がインストールされているディレクトリを $CONTINUUM_HOME と記述する。 実際に設定した環境は Debian Etch + JDK 1.5.0。

Continuum に Jetty の AJP モジュールを組み込む

Continuum に同梱されている Jetty には AJP 用のモジュールが含まれていない。 そのため、別途 Jetty をダウンロードしてモジュールを入手し、組み込む必要がある。

Jetty 6.1.11
http://dist.codehaus.org/jetty/jetty-6.1.11/
ダウンロードした ZIP に含まれている jetty-ajp-6.1.11.jar を $CONTINUUM_HOME/lib にコピーする。

Jetty の設定変更

$CONTINUUM_HOME/conf/jetty.xml の以下の 2 箇所を変更する。

以下の <Call name="addConnector"> をコメントアウト。

<!-- Use this connector for many frequently idle connections
     and for threadless continuations.
-->   
<!-- START SNIPPET: jetty_port -->
<!--
<Call name="addConnector">
  <Arg>
      <New class="org.mortbay.jetty.nio.SelectChannelConnector">
        <Set name="host"><SystemProperty name="jetty.host" /></Set>
        <Set name="port"><SystemProperty name="jetty.port" default="8080"/></Set>
        <Set name="maxIdleTime">30000</Set>
        <Set name="Acceptors">2</Set>
        <Set name="statsOn">false</Set>
        <Set name="confidentialPort">8443</Set>
        <Set name="lowResourcesConnections">5000</Set>
        <Set name="lowResourcesMaxIdleTime">5000</Set>
      </New>
  </Arg>
</Call>
-->
<!-- END SNIPPET: jetty_port -->

以下を追記。

<Call name="addConnector">
  <Arg>
    <New class="org.mortbay.jetty.ajp.Ajp13SocketConnector">
      <Set name="port">8009</Set>
    </New>
  </Arg>
</Call>
変更完了後に Continuum を再起動する。

Apache HTTP Server の設定変更

httpd.conf に以下を追記(実際には、各環境に合わせた /etc/apache2/sites-available 内のファイル)。

<Location "/continuum">
  ProxyPass ajp://localhost:8009/continuum

  Order allow,deny
  allow from all
</Location>
変更完了後に Apache HTTP Server を再起動する。

設定変更の確認

http://example.com/continuum に Web ブラウザで接続する。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 26, 2009

[Maven] Apache Maven 2.1.0 がリリースされた!!

2009/03/21 に Apache Maven 2.1.0 がリリースされていた。 暇を見つけて早速入れ替えてみよう。 リリースノートをざっと見た感じでは関係ありそうなのはバグ FIX くらいで、嬉しい新機能はなさそう。

Apache Maven Project
http://maven.apache.org/
Maven 2.1.0
http://maven.apache.org/release-notes.html
Release Notes - Maven 2 - Version 2.1.0 - HTML format
http://jira.codehaus.org/secure/ReleaseNote.jspa?version=14587&styleName=Html&projectId=10500

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 10, 2009

[Maven] 何かに依存するライブラリを使用する

たまに「何かに依存するライブラリ」というものがある。 例えば、JDK のバージョンに依存する json-lib。 例えば、OS に依存する Eclipse SWT。
この様なライブラリは groupId, artifactId, version 以外の属性で jar を切り替えるものと考えることができる。 素晴らしいことに Maven2 ではこの様な状況も想定し、classifier という属性が用意されている。 pom.xml に classifier を指定することで「依存する何か」で jar を切り替えることができる。

Maven Documentation - Technical Project Descriptor
http://maven.apache.org/ref/current/maven-model/maven.html#class_dependency

pom.xml の記述方法

pom.xml の dependency に classifier を指定するだけで良い。 OS 毎に Eclipse SWT を切り替える場合は以下の様になる。 ちなみに、http://repo1.maven.org/maven2/ にはこの例の jar は登録されていない。

  <project>
    <dependencies>
      <dependency>
        <groupId>org.eclipse.swt</groupId>
        <artifactId>swt</artifactId>
        <version>3.4</version>
        <classifier>carbon-macosx</classifier>
        <scope>compile</scope>
      </dependency>
    </dependencies>
  </project>


properties を使用すると設定が楽になる。
  <project>
    <properties>
      <swt-classifier>carbon-macosx</swt-classifier>
    </properties>
    <dependencies>
      <dependency>
        <groupId>org.eclipse.swt</groupId>
        <artifactId>swt</artifactId>
        <version>3.4</version>
        <classifier>${swt-classifier}</classifier>
        <scope>compile</scope>
      </dependency>
    </dependencies>
  </project>

リモートリポジトリの構成

リモートリポジトリのディレクトリ構成、pom.xml は classifier 無しのものと同じ。 異なるのは jar ファイルが classifier 毎に複数用意されるというところ。 jar ファイル名は <artifactId>-<version>-<classifier>.jar となる。 上の Eclipse SWT の例の jar を登録する場合、下記の様な構成となる。

  $REPOSITORY_HOME
    └ org
       └ eclipse
           └ swt
              └ swt
                 └ 3.4
                    ├ swt-3.4.pom
                    ├ swt-3.4-carbon-macosx.jar
                    └ swt-3.4-gtk-linux-x86.jar

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 07, 2008

[Maven] Maven2 の release プラグインにチャレンジ

Maven2 では maven-release-plugin を使用することで簡単にリリース作業を行うことができる。 maven-release-plugin を使うことで、

  • SCM のタグ付け
  • pom.xml の <version> 更新
  • Maven リポジトリへのプロジェクト登録
  • Web サーバへのドキュメント登録

を簡単に行うことができる。

Maven Release Plugin
http://maven.apache.org/plugins/maven-release-plugin/
Technical Project Descriptor
http://maven.apache.org/ref/current/maven-model/maven.html
Technical Settings Descriptor
http://maven.apache.org/ref/current/maven-settings/settings.html

環境

サーバ環境

サーバは "dev.example.com" と表記し、以下の環境であることを前提とする。

  • http://dev.example.com/project/maven で WebDAV が利用可能。
  • http://dev.example.com/project/maven-snapshot で WebDAV が利用可能。
  • http://dev.example.com/project/dist で WebDAV が利用可能。
  • http://dev.example.com/project/svn で Subversion にアクセス可能。

クライアント環境

クライアントの環境はこんな感じ。Maven2 と svn コマンドが動作するだけで良いはず。

$ mvn --version
Maven version: 2.0.9
Java version: 1.5.0_13
OS name: "mac os x" version: "10.4.11" arch: "i386" Family: "unix"
$ svn --version
svn, version 1.5.1 (r32289)
   compiled Aug  6 2008, 13:59:27

Copyright (C) 2000-2008 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
  - handles 'http' scheme
  - handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
  - with Cyrus SASL authentication
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
* ra_serf : Module for accessing a repository via WebDAV protocol using serf.
  - handles 'http' scheme
  - handles 'https' scheme
$

設定

pom.xml

$PROJECT_HOME/pom.xml に release 用の設定を行う。

  • scm の設定
  • distributionManagement の設定
  • maven-release-plugin の組み込み
  • (Web DAV を利用する場合は) wagon-webdav の組み込み
<?xml version="1.0" encoding="UTF-8"?>
<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>jp.in-vitro.dummy</groupId>
  <artifactId>dummy</artifactId>
  <version>1.0.1-SNAPSHOT</version>
  <name>Dummy</name>
  <description>Dummy Project</description>
  <packaging>jar</packaging>

  <scm>
    <url>http://dev.example.com/project/svn/Dummy/tags/dummy-1.0.0</url>
    <connection>scm:svn:http://dev.example.com/project/svn/Dummy/tags/dummy-1.0.0</connection>
    <developerConnection>scm:svn:http://dev.example.com/project/svn/Dummy/tags/dummy-1.0.0</developerConnection>
  </scm>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <configuration>
          <username>${scm.username}</username>
          <password>${scm.password}</password>
        </configuration>
      </plugin>
    </plugins>
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-webdav</artifactId>
      </extension>
    </extensions>
  </build>

  <distributionManagement>
    <repository>
      <id>project.repository.release</id>
      <name>Project Repository</name>
      <url>dav:http://dev.example.com/project/maven</url>
    </repository>
    <snapshotRepository>
      <id>project.repository.snapshots</id>
      <uniqueVersion>false</uniqueVersion>
      <name>Project Snapshots Repository</name>
      <url>dav:http://dev.example.com/project/maven-snapshot</url>
    </snapshotRepository>
    <site>
      <id>project.website</id>
      <url>dav:http://dev.example.com/project/dist/${pom.version}</url>
    </site>
  </distributionManagement>
</project>

settings.xml の設定

$USER_HOME/.m2/settings.xml に SCM や Web DAV のアカウント情報を記述する。

<?xml version="1.0" encoding="UTF-8" ?>

<settings 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/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
      <id>project.repository.release</id>
      <username>me</username>
      <password>password</password>
    </server>
    <server>
      <id>project.repository.snapshots</id>
      <username>me</username>
      <password>password</password>
    </server>
    <server>
      <id>project.website</id>
      <username>me</username>
      <password>password</password>
    </server>
  </servers>

  <profiles>
    <profile>
      <id>project</id>
      <properties>
        <scm.username>me</scm.username>
        <scm.password>password</scm.password>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>project</activeProfile>
  </activeProfiles>
</settings>

maven-release-plugin の実行

release:prepare

まずはリリースの準備として release:prepare を実行する。 release:prepare では、"リリースするバージョン"、"SCM に付けるタグ", "次のバージョン" を質問されるので、それぞれ入力する。

$ mvn release:prepare
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'release'.
WAGON_VERSION: 1.0-beta-2
[INFO] ------------------------------------------------------------------------
[INFO] Building Dummy
[INFO]    task-segment: [release:prepare] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [release:prepare]
[INFO] Verifying that there are no local modifications...
[INFO] Executing: svn --username me --password ***** --non-interactive status
[INFO] Working directory: /Users/me/Documents/Private/000-workspace/Dummy
[INFO] Checking dependencies and plugins for snapshots ...
What is the release version for "Dummy"? (jp.in-vitro.dummy:dummy) 1.0.1: : 
What is SCM release tag or label for "Dummy"? (jp.in-vitro.dummy:dummy) dummy-1.0.1: : 
What is the new development version for "Dummy"? (jp.in-vitro.dummy:dummy) 1.0.2-SNAPSHOT: : 
[INFO] Transforming 'Dummy'...
[INFO] Not generating release POMs
[INFO] Executing goals 'clean verify'...
  (略)
[INFO] Release preparation complete.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 17 seconds
[INFO] Finished at: Fri Oct 03 18:20:48 JST 2008
[INFO] Final Memory: 6M/12M
[INFO] ------------------------------------------------------------------------
$

release:perform

release:prepare が正常終了したら、release:perform を実行する。 release:perform を実行すると、SCM へのタグ付けやリポジトリへの登録、バージョンの更新などのリリース処理が行われる。

$ mvn release:perform
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'release'.
WAGON_VERSION: 1.0-beta-2
[INFO] ------------------------------------------------------------------------
[INFO] Building Dummy
[INFO]    task-segment: [release:perform] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [release:perform]
[INFO] Checking out the project to perform the release ...
[INFO] Executing: svn --username me --password ***** --non-interactive checkout http://dev.example.com/project/svn/Dummy/tags/dummy-1.0.1 checkout
[INFO] Working directory: /Users/me/Documents/Private/000-workspace/Dummy/target
[INFO] Executing goals 'deploy site-deploy'...
[INFO] Executing: mvn deploy site-deploy --no-plugin-updates -P project -DperformRelease=true -f pom.xml
[INFO] Scanning for projects...
        WAGON_VERSION: 1.0-beta-2
        [INFO] ------------------------------------------------------------------------
        [INFO] Building Dummy
        [INFO]    task-segment: [deploy, site-deploy]
        [INFO] ------------------------------------------------------------------------
        [INFO] [resources:resources]
        [INFO] Using default encoding to copy filtered resources.
        [INFO] [compiler:compile]
  (略)
        Transfer finished. 1687 bytes copied in 0.025 seconds
        http://dev.example.com/project/dist/1.0.1 - Session: Disconnecting  
        http://dev.example.com/project/dist/1.0.1 - Session: Disconnected
        [INFO] ------------------------------------------------------------------------
        [INFO] BUILD SUCCESSFUL
        [INFO] ------------------------------------------------------------------------
        [INFO] Total time: 1 minute 2 seconds
        [INFO] Finished at: Fri Oct 03 18:22:01 JST 2008
        [INFO] Final Memory: 39M/63M
        [INFO] ------------------------------------------------------------------------
        [INFO] Cleaning up after release...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 minute 8 seconds
[INFO] Finished at: Fri Oct 03 18:22:02 JST 2008
[INFO] Final Memory: 6M/12M
[INFO] ------------------------------------------------------------------------
$ 

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 06, 2008

Aug 25, 2008

[Maven] Maven2 で Apache Tomcat の context.xml を WAR に追加する方法

Maven2 で Apache Tomcat の context.xml を WAR に追加する方法をメモ。 何故メモするかというと、現時点(2008/08/25)では普通に設定するだけでは動作しないから。
想定された通りの挙動であれば、pom.xml に

<?xml version="1.0" encoding="UTF-8"?>

<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">
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <containerConfigXML>src/main/webapp/META-INF/context.xml</containerConfigXML>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
と設定すれば src/main/webapp/META-INF/context.xml が WAR の META-INF/context.xml として格納される。
war:war
http://maven.apache.org/plugins/maven-war-plugin/war-mojo.html#containerConfigXML
ところが、この containerConfigXML というオプション、maven-war-plugin のバグにより現時点では動作しない。
Option containerConfigXML doesn't work
http://jira.codehaus.org/browse/MWAR-120?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel
バグレポートによると既にこのバグは修正済みで、修正されたバージョンは 2.1-alpha-2 ということなので、maven-war-plugin を 2.1-alpha-2 にする必要がある。 maven-war-plugin 2.1-alpha-2 を使用するには pom.xml を下記の通り設定すれば良い。
<?xml version="1.0" encoding="UTF-8"?>

<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">
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1-alpha-2</version>
        <configuration>
          <containerConfigXML>src/main/webapp/META-INF/context.xml</containerConfigXML>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
maven-war-plugin 2.1-alpha-2 のリリースノートはこちら。
[ANN] Maven War Plugin 2.1-alpha-2 Released
http://mail-archives.apache.org/mod_mbox/maven-announce/200808.mbox/%3Cadba96190808140822t6d87b6c2k9fa0d9ee444d5a9c@mail.gmail.com%3E

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 24, 2008

[Maven] Maven2 で Test*.java をテストケースとして認識させない方法

Maven2 ではビルドの際に **/Test*.java、**/*Test.java、**/*TestCase.java をテストケースとして認識する。 Test*.java はテストケースとして使用したくないので、設定を変更してみた。

surefire:test
http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#includes

設定の変更方法

pom.xml に以下を追加する。

<?xml version="1.0" encoding="UTF-8"?>

<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">
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <includes>
            <include>**/*Test.java</include>
            <include>**/*TestCase.java</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Sep 03, 2007

[Maven] deploy の際に、Javadoc もリモートリポジトリに登録したい

ついでに、"mvn deploy" 時に Javadoc もリモートリポジトリに登録するように設定をしてみた。

pom.xml の設定方法

設定はいたって簡単。、 maven-javadoc-plugin を pom.xml に登録するだけ。 設定方法は下記の通り。

<project>
  <build>
    <plugins>
      <plugin>
      	<groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <executions>
          <execution>
            <id>attach-javadocs</id>
            <goals>
              <goal>jar</goal>
            </goals>
            <phase>deploy</phase>
          </execution>
        </executions>
        <configuration>
          <outputEncoding>Shift_JIS</outputEncoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Sep 02, 2007

[Maven] deploy の際に、ソースコードもリモートリポジトリに登録したい

"mvn deploy" を実行するとリモートリポジトリに bytecode の jar が登録される。 とりあえずそれで十分と言えば十分なのだけれど、Maven 2.x Integration for Eclipse を使っているとソースコードがリモートリポジトリにあるととても幸せになれる。 というわけで、"mvn deploy" 時にソースコードもリモートリポジトリに登録するように設定をしてみた。

pom.xml の設定方法

設定はいたって簡単。、 maven-source-plugin を pom.xml に登録するだけ。 設定方法は下記の通り。

<project>
  <build>
    <plugins>
      <plugin>
      	<groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar</goal>
            </goals>
            <phase>deploy</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 30, 2007

[Maven] Maven2 の assembly プラグインにチャレンジ

maven-assembly-plugin とは

いわゆる「出荷用アーカイブの作成」に近いイメージのプラグイン。 特に出荷用というわけではないのだけれど、プロジェクト内の好きなファイルをアーカイビングすることが出来る。 アーカイブの形式も zip、tar.gz、tar.bz2、jar など様々な形式に対応している。 今回は、開発環境(要するにソース一式)を他の開発者にそのままアーカイビングして渡すことをイメージして遊んでみた。

Maven Assembly Plugin
http://maven.apache.org/plugins/maven-assembly-plugin/
assembly:assembly
http://maven.apache.org/plugins/maven-assembly-plugin/assembly-mojo.html
Guide to creating assemblies
http://maven.apache.org/guides/mini/guide-assemblies.html
ソースコード
https://svn.apache.org/repos/asf/maven/plugins/tags/maven-assembly-plugin-2.2-beta-1/

pom.xml の設定

<project>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptor>assemple.xml</descriptor>
          <outputDirectory>..</outputDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

maven-assembly-plugin の設定ファイル

pom.xml で指定した名称で maven-assembly-plugin の設定ファイルを作成する。 下の例は開発環境を渡すことを想定しているため、ソースコード類とビルドツールをアーカイビングしている。

<?xml version="1.0" encoding="UTF-8"?>

<assembly>
  <id>src</id>
  <formats>
    <format>tar.gz</format>
  </formats>
  <fileSets>
    <fileSet>
      <includes>
        <include>*.*</include>
        <include>.settings/**/*.*</include>
        <include>module1/pom.xml</include>
        <include>module1/src/**/*.*</include>
        <include>module2/pom.xml</include>
        <include>module2/src/**/*.*</include>
        <include>tool/maven-2.0.6/**/*.*</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

maven-assembly-plugin の実行

下のコマンドで実行できる。今回の例では、プロジェクトホームと同じディレクトリに ${finalName}-src.tar.gz というアーカイブが作成される。 アーカイブファイルに設定ファイルの id が付加される。

> mvn assembly:assembly

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 22, 2007

[Maven] packaging の際にソースコードの jar も生成する。

Maven2 で "mvn package" する際に同時にソースコード及びリソースを jar でアーカイビングする方法をメモ。 納品の際に便利。

pom.xml の設定

maven-source-plugin を使用するだけなので、設定は非常に簡単。 ただ、maven-source-plugin のソースコードを見ると、pom.xml に登録するだけで package phase になると自動的に実行される設定になっているのだが、 実際に動作させてみると何故か動かない。仕方がないので、executions を指定して実行するようにした。環境の問題だろうか?? バグだろうか??

<project>

    ...SNIP...

  <build>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
      <executions>
        <phase>package</phase>
        <execution>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </build>

    ...SNIP...

</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 18, 2007

[Maven] Maven2 Cobertura plugin でカバレッジにチャレンジ

Cobertura とは

Cobertura は、Java 用のカバレッジツール。類似のものに CloverEMMAjcoverage などがある。 けれど、Clover は商用利用はライセンス購入が必要、EMMA は Maven2 用のプラグインが無い、JCoverage はいつの間にか Eclipse Plugin 専用になっている、ということで現状 Maven2 で気楽にカバレッジツールを使用する場合は Cobertura しか選択肢が無い。 というわけで、Cobertura を使用してカバレッジレポートを作成してみた。

Cobertura
http://cobertura.sourceforge.net/

pom.xml の設定

Cobertura の設定は build で instrument して、report で結果を出力するようにすれば良い。 pom.xml に下記の様な設定をして、"mvn site" で簡単にカバレッジレポートを見ることができる。

<project>

    ...SNIP...

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <executions>
          <phase>pre-site</phase>
          <execution>
            <goals>
              <goal>clean</goal>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

    ...SNIP...

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </reporting>

</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 16, 2007

[Maven] Maven2 で POM の inheritance & aggregation を整理してみる(4)

まとめ

結局、Maven2 の Inheritance と Aggregation は上手く使いわけると結構便利だと再認識できた。 Maven2 の POM を階層化して管理する場合は下記の図の様になるだろうか。

[Inheritance と Aggregation の使い分け]

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 14, 2007

[Maven] Maven2 で POM の inheritance & aggregation を整理してみる(3)

inheritance & aggregation の実験

inheritance & aggregation 用のサンプルプロジェクトは下記の様な構成。 基本的には前回 2 つと全く同じ。 \both\pom.xml は packageing=pom で aggregation を使用できるようにしてある。 \both\child\pom.xml は継承を表す parent タグを使用して \both\pom.xml を継承してある。

\both
  ├pom.xml
  └child
    ├pom.xml
    └src
      └java
        └com
         └example
           └HelloWorld.java

\both\pom.xml

artifactId、name 以外は aggregation のサンプルと全く同一。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>
  <name>pom both sample</name>
  <groupId>com.example</groupId>
  <artifactId>pom-both-sample</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>jp.in-vitro.largo</groupId>
        <artifactId>largo-support-pom</artifactId>
        <version>2.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>dumpPom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <charset>Shift_JIS</charset>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <organization>
    <name>example.com</name>
    <url>http://www.example.com/</url>
  </organization>

  <developers>
    <developer>
      <id>me</id>
      <name>me</name>
    </developer>
  </developers>

  <issueManagement>
    <system>Bugzilla</system>
    <url>http://www.example.com/bugzilla</url>
  </issueManagement>

  <ciManagement>
    <system>continuum</system>
    <url>http://www.example.com/continuum</url>
  </ciManagement>

  <mailingLists>
    <mailingList>
      <name>Developer ML</name>
      <subscribe>subscribe@example.com</subscribe>
      <unsubscribe>unsubscribe@example.com</unsubscribe>
      <post>developer@example.com</post>
    </mailingList>
  </mailingLists>

  <scm>
    <connection>scm:svn:http://www.example.com/svn/my-project</connection>
    <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
    <tag>HEAD</tag>
    <url>http://www.example.com/websvn/my-project</url>
  </scm>

  <repositories>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>http://www.example.com/maven2</url>
    </repository>
  </repositories>
  
  <distributionManagement>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>scp://www.example.com/maven2</url>
    </repository>
  </distributionManagement>
  
  <modules>
    <module>child</module>
  </modules>

</project>

\both\child\pom.xml

artifactId、name 以外は inheritance のサンプルと全く同一。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>pom-both-sample</artifactId>
    <version>1.0.0</version>
  </parent>

  <artifactId>pom-both-sample-child</artifactId>
  <name>pom both sample - child</name>
  <packaging>jar</packaging>

</project>

\both で Maven2 による compile を実行した結果

aggregation を使用しているので、\both\pom.xml を使用してコンパイルを実行すると \both\child\pom.xml も同時に処理されている。 また、inheritance も使用しているので、\both\pom.xml の設定項目が \both\child\pom.xml に継承されている。


both>mvn compile
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   pom both sample
[INFO]   pom both sample - child
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom both sample
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-both-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample
  version : 1.0.0
  name : pom both sample
***********************************************************
Parent : null
File : D:\both\pom.xml
Basedir : D:\both
Repositories : [org.apache.maven.model.Repository@13059051[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@3945515[name=M
aven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout=
default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@8530b8],
]
Modules : [child,]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@1deeb40,]
Developers : [org.apache.maven.model.Developer@30633470[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@25109548[name=example.com,url
=http://www.example.com/]

[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom both sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\both\child\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-both-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample-child
  version : 1.0.0
  name : pom both sample - child
***********************************************************
Parent : org.apache.maven.project.MavenProject@f328409
File : D:\both\child\pom.xml
Basedir : D:\both\child
Repositories : [org.apache.maven.model.Repository@29857804[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@13594894[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@1077fc9
],]
Modules : []
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@a2220f,]
Developers : [org.apache.maven.model.Developer@1668655[name=me,email=null,id=me,
organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@7388808[name=example.com,url=
http://www.example.com/]

***** POM INFORMATION *************************************
  id : com.example:pom-both-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample
  version : 1.0.0
  name : pom both sample
***********************************************************
Parent : null
File : D:\both\pom.xml
Basedir : D:\both
Repositories : [org.apache.maven.model.Repository@13059051[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@3945515[name=M
aven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout=
default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@8530b8],
]
Modules : [child,]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@1deeb40,]
Developers : [org.apache.maven.model.Developer@30633470[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@25109548[name=example.com,url
=http://www.example.com/]

[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] pom both sample ....................................... SUCCESS [0.969s]
[INFO] pom both sample - child ............................... SUCCESS [1.766s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Mon May 14 00:14:11 JST 2007
[INFO] Final Memory: 4M/13M
[INFO] ------------------------------------------------------------------------

both>

\both\child で Maven2 による compile を実行した結果

\both\child\pom.xml を使用してコンパイルを実行してみる。 \both\pom.xml を継承しているので、\both\child\pom.xml がきちんと \both\pom.xml の内容を引き継いでいることが分かる。


both\child>mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom both sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\both\child\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-both-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample-child
  version : 1.0.0
  name : pom both sample - child
***********************************************************
Parent : org.apache.maven.project.MavenProject@f328409
File : D:\both\child\pom.xml
Basedir : D:\both\child
Repositories : [org.apache.maven.model.Repository@33459432[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@13948523[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@149105b
],]
Modules : []
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@196f4b5,]
Developers : [org.apache.maven.model.Developer@33445663[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@6326112[name=example.com,url=
http://www.example.com/]

***** POM INFORMATION *************************************
  id : com.example:pom-both-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample
  version : 1.0.0
  name : pom both sample
***********************************************************
Parent : null
File : D:\both\pom.xml
Basedir : D:\both
Repositories : [org.apache.maven.model.Repository@13301441[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@17708501[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@1f03691
],]
Modules : [child,]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@1b03c1a,]
Developers : [org.apache.maven.model.Developer@5313146[name=me,email=null,id=me,
organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@6888942[name=example.com,url=
http://www.example.com/]

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Mon May 14 00:22:39 JST 2007
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

both\child>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 13, 2007

[Maven] Maven2 で POM の inheritance & aggregation を整理してみる(2)

aggregation の実験

aggregation 用のサンプルプロジェクトは下記の様な構成。 基本的には inheritance 用と全く同じ。 \aggregation\pom.xml は packageing=pom で aggregation を使用できるようにしてある。 \aggregation\child\pom.xml は inheritance の時とは異なり、継承を表す parent タグを外してある。

\aggregation
  ├pom.xml
  └child
    ├pom.xml
    └src
      └java
        └com
         └example
           └HelloWorld.java

\aggregation\pom.xml

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>
  <name>pom aggregation sample</name>
  <groupId>com.example</groupId>
  <artifactId>pom-aggregation-sample</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>jp.in-vitro.largo</groupId>
        <artifactId>largo-support-pom</artifactId>
        <version>2.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>dumpPom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <charset>Shift_JIS</charset>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <organization>
    <name>example.com</name>
    <url>http://www.example.com/</url>
  </organization>

  <developers>
    <developer>
      <id>me</id>
      <name>me</name>
    </developer>
  </developers>

  <issueManagement>
    <system>Bugzilla</system>
    <url>http://www.example.com/bugzilla</url>
  </issueManagement>

  <ciManagement>
    <system>continuum</system>
    <url>http://www.example.com/continuum</url>
  </ciManagement>

  <mailingLists>
    <mailingList>
      <name>Developer ML</name>
      <subscribe>subscribe@example.com</subscribe>
      <unsubscribe>unsubscribe@example.com</unsubscribe>
      <post>developer@example.com</post>
    </mailingList>
  </mailingLists>

  <scm>
    <connection>scm:svn:http://www.example.com/svn/my-project</connection>
    <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
    <tag>HEAD</tag>
    <url>http://www.example.com/websvn/my-project</url>
  </scm>

  <repositories>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>http://www.example.com/maven2</url>
    </repository>
  </repositories>
  
  <distributionManagement>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>scp://www.example.com/maven2</url>
    </repository>
  </distributionManagement>
  
  <modules>
    <module>child</module>
  </modules>

</project>

\aggregation\child\pom.xml

今回は aggregation のみ使用することが目的なので、inheritance を表す parent タグは使用していない。 \aggregation\pom.xml との違いを明確にするために、わざとほとんどの設定を省略している。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>pom-aggregation-sample-child</artifactId>
  <version>1.0.0</version>
  <name>pom aggregation sample - child</name>
  <packaging>jar</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>jp.in-vitro.largo</groupId>
        <artifactId>largo-support-pom</artifactId>
        <version>2.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>dumpPom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

\aggregation で Maven2 による compile を実行した結果

aggregation を使用しているので、\aggregation\pom.xml を使用してコンパイルを実行すると \aggregation\child\pom.xml も同時に処理されている。 今回は inheritance を使用していないので、\aggregation\child\pom.xml では \aggregation\pom.xml の内容は引き継がれていない。 例えば、Developer や Organization といった項目に注目してみると、\aggregation\child\pom.xml では空になっていることが分かる。 また、\aggregation\pom.xml では、Modules に child が設定されていることが分かる。


aggregation>mvn compile
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   pom aggregation sample - child
[INFO]   pom aggregation sample
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom aggregation sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\aggregation\child\tar
get\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-aggregation-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-aggregation-sample-child
  version : 1.0.0
  name : pom aggregation sample - child
***********************************************************
Parent : null
File : D:\aggregation\child\pom.xml
Basedir : D:\aggregation\child
Repositories : [org.apache.maven.model.Repository@29345020[name=Maven Repository
 Switchboard,url=http://repo1.maven.org/maven2,id=central,layout=default,release
s=null,snapshots=org.apache.maven.model.RepositoryPolicy@11db6bb],]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : []
Developers : []
Organization : null

[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom aggregation sample
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-aggregation-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-aggregation-sample
  version : 1.0.0
  name : pom aggregation sample
***********************************************************
Parent : null
File : D:\aggregation\pom.xml
Basedir : D:\aggregation
Repositories : [org.apache.maven.model.Repository@30311876[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@28326938[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@139e351
],]
Modules : [child,]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@51127a,]
Developers : [org.apache.maven.model.Developer@30167145[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@13594894[name=example.com,url
=http://www.example.com/]

[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] pom aggregation sample - child ........................ SUCCESS [2.640s]
[INFO] pom aggregation sample ................................ SUCCESS [0.047s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun May 13 18:05:02 JST 2007
[INFO] Final Memory: 4M/9M
[INFO] ------------------------------------------------------------------------

aggregation>

\aggregation\child で Maven2 による compile を実行した結果

\aggregation\child\pom.xml を使用してコンパイルを実行してみる。 aggregation を使用していても、基本的には \aggregation\pom.xml との親子関係は無いので単体で問題なくコンパイルできる。

aggregation\child>mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom aggregation sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\aggregation\child\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-aggregation-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-aggregation-sample-child
  version : 1.0.0
  name : pom aggregation sample - child
***********************************************************
Parent : null
File : D:\aggregation\child\pom.xml
Basedir : D:\aggregation\child
Repositories : [org.apache.maven.model.Repository@33459432[name=Maven Repository
 Switchboard,url=http://repo1.maven.org/maven2,id=central,layout=default,release
s=null,snapshots=org.apache.maven.model.RepositoryPolicy@d4d66b],]
Modules : []
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : []
Developers : []
Organization : null

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun May 13 18:12:51 JST 2007
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

aggregation\child>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 12, 2007

[Maven] Maven2 で POM の inheritance & aggregation を整理してみる(1)

POM の inheritance & aggregation

普段何気なく使っている POM の inheritance や aggregation だけれど、 考えてみると極端に複雑なプロジェクトを構築したことが無いので常に両方を同時に使用することが多かった。 そこで、一度 inheritance と aggregation の違いとそれぞれの意味を整理してみた。

inheritance の実験

下記の様な構成のプロジェクトをでっち上げてみた。 \inheritance\pom.xml は packageing=pom で親 POM になれるようにしてある(下記参照)。 \inheritance\child\pom.xml は \inheritance\pom.xml を継承するように設定してある。

\inheritance
  ├pom.xml
  └child
    ├pom.xml
    └src
      └java
        └com
         └example
           └HelloWorld.java

\inheritance\pom.xml

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>
  <name>pom inheritance sample</name>
  <groupId>com.example</groupId>
  <artifactId>pom-inheritance-sample</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>jp.in-vitro.largo</groupId>
        <artifactId>largo-support-pom</artifactId>
        <version>2.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>dumpPom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <charset>Shift_JIS</charset>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <organization>
    <name>example.com</name>
    <url>http://www.example.com/</url>
  </organization>

  <developers>
    <developer>
      <id>me</id>
      <name>me</name>
    </developer>
  </developers>

  <repositories>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>http://www.example.com/maven2</url>
    </repository>
  </repositories>

</project>

\inheritance\child\pom.xml

今回は inheritance のみ使用することが目的なので、aggregation を表す modules タグは使用していない。 ただ、parent タグで親の POM を指定しているため、記述量が圧倒的に減少していることがすぐに分かる。 ちなみに、POM の内容は簡単な自作の Maven Plugin で出力している。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>pom-inheritance-sample</artifactId>
    <version>1.0.0</version>
  </parent>

  <artifactId>pom-inheritance-sample-child</artifactId>
  <name>pom inheritance sample - child</name>
  <packaging>jar</packaging>

</project>

\inheritance で Maven2 による compile を実行した結果

aggregation を使用していないので、\inheritance\pom.xml が表しているプロジェクトのみがコンパイルされている。 \inheritance\child\pom.xml は全く無視されていることに注目。

inheritance>mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom inheritance sample
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\inheritance\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-inheritance-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-inheritance-sample
  version : 1.0.0
  name : pom inheritance sample
***********************************************************
Parent : null
File : D:\inheritance\pom.xml
Basedir : D:\inheritance
Repositories : [org.apache.maven.model.Repository@33459432[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@13948523[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@149105b
],]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@196f4b5,]
Developers : [org.apache.maven.model.Developer@17427094[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@14069849[name=example.com,url
=http://www.example.com/]

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun May 13 16:40:33 JST 2007
[INFO] Final Memory: 4M/9M
[INFO] ------------------------------------------------------------------------

inheritance>

\inheritance\child で Maven2 による compile を実行した結果

\inheritance\child\pom.xml を使用してコンパイルを実行してみる。 こちらもこちらで自分自身のプロジェクトのみを処理対象としている。 但し、POM の内容は \inheritance\pom.xml の内容を継承しているため、 \interitance\child\pom.xml では設定をしていない項目もきちんと設定が受け継がれていることが分かる。 例えば、Developer や Organization といった項目を見ると良く分かる。

inheritance>cd child
inheritance\child>mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom inheritance sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\inheritance\child\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-inheritance-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-inheritance-sample-child
  version : 1.0.0
  name : pom inheritance sample - child
***********************************************************
Parent : org.apache.maven.project.MavenProject@a6be9458
File : D:\inheritance\child\pom.xml
Basedir : D:\inheritance\child
Repositories : [org.apache.maven.model.Repository@13948523[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@21565531[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@1d0d45b
],]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
ReportPlugins : [org.apache.maven.model.ReportPlugin@19ba640,]
Developers : [org.apache.maven.model.Developer@539419[name=me,email=null,id=me,o
rganization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@13878877[name=example.com,url
=http://www.example.com/]

***** POM INFORMATION *************************************
  id : com.example:pom-inheritance-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-inheritance-sample
  version : 1.0.0
  name : pom inheritance sample
***********************************************************
Parent : null
File : D:\inheritance\pom.xml
Basedir : D:\inheritance
Repositories : [org.apache.maven.model.Repository@26117441[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@30311876[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@1b03c1a
],]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@1578aab,]
Developers : [org.apache.maven.model.Developer@19658898[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@13594894[name=example.com,url
=http://www.example.com/]

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun May 13 17:28:32 JST 2007
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

inheritance\child>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 09, 2007

[Maven] Maven2 で AbstractMethodError

まれに Maven2 実行時に AbstractMethodError が発生することがある。

[INFO] Velocimacro : initialization complete.
[INFO] Velocity successfully started.
[INFO] [site:site]
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] null
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.AbstractMethodError
        at org.apache.maven.plugins.site.SiteMojo.filterReports(SiteMojo.java:40
7)
        at org.apache.maven.plugins.site.SiteMojo.execute(SiteMojo.java:221)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPlugi
nManager.java:443)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(Defa
ultLifecycleExecutor.java:539)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLi
fecycle(DefaultLifecycleExecutor.java:480)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(Defau
ltLifecycleExecutor.java:459)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHan
dleFailures(DefaultLifecycleExecutor.java:311)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegmen
ts(DefaultLifecycleExecutor.java:278)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLi
fecycleExecutor.java:143)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:334)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:125)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:272)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)

        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 minute 31 seconds
[INFO] Finished at: Thu May 10 09:11:00 JST 2007
[INFO] Final Memory: 15M/27M
[INFO] ------------------------------------------------------------------------
例えば、mvn site 実行時に上記の様に発生する。 この場合、%USER_HOME%\.m2\repository\org を全部削除すれば良い。 Maven2 のバージョンアップを繰り返しているうちに plugin 関連の依存関係が実行時におかしくなることがあるようだ。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 08, 2007

[Maven] プライベートなリモートリポジトリの設定変更

Maven2 用のプライベートなリモートリポジトリを整理してみた。 今までは URL を一切公開していないので、特にアクセス制限はかけていなかったのだが、 とりあえず HTTPS + Basic 認証 くらいはかけておこうかと設定を変更してみた。

Maven2 リモートリポジトリの Basic 認証

これは非常に簡単。 サーバ側で Basic 認証の設定をしておいて、pom.xml、settings.xml を編集するだけ。

pom.xml

<project>
  ...SNIP...
  <repositories>
    <repository>
      <id>my-private-repository</id>
      <name>my private repository</name>
      <url>http://www.example.com/maven2</url>
    </repository>
  </repositories>
  ...SNIP...
</project>

settings.xml

<settings>
  ...SNIP...
  <servers>
    <server>
      <id>my-private-repository</id>
      <username>me</username>
      <password>mypassword</password>
    </server>
  </servers>
  ...SNIP...
</settings>

Maven2 リモートリポジトリの HTTPS アクセス

これは結局実現できなかった。 プライベートサーバなのでディジタル証明書を正規に購入するわけもなく、 オレオレ証明書で運用しているのだが、結局はそれがネックになってしまった。 JDK の cacerts にオレオレ証明書を登録してみたり、独自の keystore にオレオレ証明書を登録して MAVEN_OPTS に "-Djavax.net.ssl.trustStore=keystore -Djavax.net.ssl.trustStorePassword=password" を指定したりと色々試してみたのだが、結局動作しなかった。

自前のコードで HTTPS 接続を試してみたところ、証明書に問題がある可能性も出てきてこれ以上の調査は結構時間がかかりそうだったので断念。 いつの日か HTTPS + Basic 認証で Maven2 リモートリポジトリにアクセスしたいものだ。 ・・・ディジタル証明書を買う、というのが一番手っ取り早い解決方法なのだが。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 26, 2007

[Maven] Maven2 で JUnit4 を使用する。

ようやく Maven2 で JUnit4 のテストが出来るようになった。 ただ、2007/04/26 時点で最新の Maven2.0.6 でもデフォルトでは JUnit4 はサポートされていない。 pom.xml で Surefire のバージョンを最新(?) のものに指定する必要がある。 毎回設定するのも面倒なので、早くデフォルトで JUnit4 がサポートされないものか。

pom.xml の設定方法(最小限)
<?xml version="1.0"?>
<project>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.3</version>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.0</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>
Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 21, 2006

[Maven] pom.xml の pom / organization / name は折り返してはいけない。

唐突に Maven2 でよく分からないエラーが発生するようになってしまった。 Maven2 の依存解決時に JAR ファイルのヘッダがおかしいと言われてビルドに失敗してしまうというもの。

[INFO] [compiler:compile]
Compiling 50 source files to C:\myproject\myapp\target\classes
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure

Failure executing javac, but could not parse the error:
エラー: C:\Documents and Settings\me\.m2\repository\myproject\1.0.0\myapp-1.0.0
.jar の読み込みエラーです。invalid header field
エラー 1 個


[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Wed Jun 21 16:57:35 JST 2006
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------

結局、原因は pom.xml の pom / organization / name のコンテンツが折り返されていたことだった。 Eclipse WST の XML エディタで無意識にオートフォーマットをかけてしまっていたらしい。 なんだかものすごく deja vu を感じたので昔のエントリを見返してみると・・・「Maven2 で API Document を生成する方法」にメモしてあった orz 2 度も同じミスでハマってしまった。 今回は忘れないようにちゃんとエラー内容もメモしておく。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 27, 2006

[Maven] pom.xml で entity reference が使えない理由

pom.xml では entity reference が使用できない。 使えないのは実際に試した結果から知っていたが、理由が分からなかった。 ようやく使えない理由が書かれたドキュメントを見つけたのでメモ。 Maven 1.x の FAQ なのだけれど、Maven 2.x でも同様の理由で使えなくなっているのだろう。 使えると非常に便利なのだけれど、機構的に仕方がないといったところか。

Apache Maven 1.x Frequently Asked Questions
http://maven.apache.org/maven-1.x/faq.html#using-entities
Q. What's the problem with entities in project.xml?

A. As of Maven 1.1, external entities will not be enabled by default in project.xml, and their use is discouraged in Maven 1.0.x as well. There will still be the ability to use them, but it will have to be enabled.

There are several reasons for this, but the main reason is that the content of project.xml needs to be completely self-contained and and able to be reproduced from a history at any point in time.

For this reason, using Jelly expressions other than ${pom.*} references is also not recommended and likely to be unsupported in future.

The most common use of this technique is to manage dependencies across multiple projects. You should strongly consider using inheritence for this purpose.

Note: special character entities will always be supported and should not have any current issues.

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 26, 2006

[Maven] Maven2 のバージョンを自動チェックする方法

Maven2 の実行時に Maven2 のバージョンを自動チェックすることができる。 例えば、2.0.3 以前の Maven2 が使用された場合はビルドを強制的に失敗させる、といったことが可能。 ビルドプロセスが Maven2 のバージョンに依存することは少ないと思うけれど、大規模プロジェクトではこの機能を使っておくと安心できそう。

設定方法

pom.xml の project/prerequisites/maven でバージョンを指定する。

<project>
	<prerequisites>
		<maven>2.0.4</maven>
	</prerequisites>
</project>
詳細な設定方法は以下を参照のこと。
Project Descriptor - Prerequisites
http://maven.apache.org/ref/current/maven-model/maven.html#class_prerequisites

動作例

project/prerequisites/maven に 2.0.5 を指定した状態で、2.0.4 を使用してビルドすると下記の様にビルドに失敗する。

>mvn --version
Maven version: 2.0.4

>mvn clean
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Unable to build project 'C:\MyProject\pom.xml; it requires Maven version
 2.0.5
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Thu May 25 19:09:36 JST 2006
[INFO] Final Memory: 1M/2M
[INFO] ------------------------------------------------------------------------

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 07, 2006

[Maven] Maven2 でアーカイブのファイル名を指定する

Maven2 でアーカイブを生成すると、デフォルトでは artifactId と version からファイル名が決定される。 WAR だとアーカイブファイル名がコンテキスト名として使用されるので、任意のファイル名を指定したい。 いつも設定方法を忘れるので、メモしておく。

アーカイブファイル名の指定方法

アーカイブファイル名は project/build/finalName で指定する。 ↓の例では my-war-file.war という WAR ファイルが生成される。

<?xml version="1.0"?>
<project>
  <artifactId>my-artifact</artifactId>
  <version>1.0.0</version>
  <packaging>war</packaging>
  <build>
    <finalName>my-war-file</finalName>
  </build>
</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 30, 2006

Mar 29, 2006

[Maven] Maven2 で API Document を生成する方法

Maven2 では maven-javadoc-plugin というプラグインが提供されており、このプラグインを使用することで簡単に API Document を生成できる。 但し、デフォルトの設定ではお約束のように 2 バイト文字が文字化けするので、多少設定が必要。

javadoc:javadoc
http://maven.apache.org/plugins/maven-javadoc-plugin/javadoc-mojo.html

maven-javadoc-plugin の設定方法

<pom>
  <organization>
    <name>in-vitro.jp</name>  ←改行コードが入るとエラー
    <url>http://www.in-vitro.jp/</url>
  </organization>
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <charset>Shift_JIS</charset>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
</pom>

maven-javadoc-plugin の実行方法

JDK と Maven2 にパスを通したコンソールから、下記のコマンドを実行する。 生成された API Document は target/site に出力される。

  > mvn site

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 03, 2006

[Maven] リモートリポジトリをローカルのストレージに置く方法

Maven2 のリモートリポジトリをプロジェクトホームの下に置く方法をメモ。 リモートリポジトリをサーバに置くことができないこともあるので。 pom.xml に下記の設定を行うと、$PROJECT_HOME/repository がリモートリポジトリとして認識される。

<pom>
  <repositories>
    <repository>
      <id>softwareframework-repository</id>
      <name>software framework repository</name>
      <url>file://${basedir}/repository</url>
    </repository>
  </repositories>
</pom>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 02, 2006

[Maven] Maven2 で J2SE 5.0 のソースコードをコンパイルする方法

Maven2 で J2SE 5.0 のソースコードをコンパイルするためには pom.xml に下記の設定を行う必要がある。 至る所で紹介されている情報だけれど、頻繁に行う設定なのでメモしておく。

<build>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
  </plugins>
</build>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 01, 2006

[Maven] CARGO にチャレンジ

CARGO とは

CARGO は、アプリケーションサーバをラッピングするオープンソースのライブラリ。 Maven、Maven2、Ant 用のプラグインが提供されており、それらから簡単にアプリケーションサーバの起動、停止などを実現することができる。 Maven2 から CARGO を使用して Tomcat の起動とアプリケーションのディプロイを行ってみた。

CARGO 公式サイト
http://www.geotools.org/display/CARGO
CARGO Maven2 plugin
http://www.geotools.org/display/CARGO/Maven2+plugin
Container Support
http://docs.codehaus.org/display/CARGO/Home#Home-Containersupport

pom.xml の設定

CARGO で Tomcat 5 を扱うためには、pom.xml に下記の設定を行う。

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.cargo</groupId>
      <artifactId>cargo-maven2-plugin</artifactId>
      <executions>
        <execution>
          <id>tomcat-execution</id>
          <phase>package</phase>
          <goals>
            <goal>start</goal>
          </goals>
          <configuration>
            <wait>false</wait>
            <container>
              <containerId>tomcat5x</containerId>
              <zipUrlInstaller>
                <url>
                  http://www.apache.org/dist/tomcat/tomcat-5/v5.5.15/bin/apache-tomcat-5.5.15.zip
                </url>
                <installDir>
                  ${installDir}
                </installDir>
              </zipUrlInstaller>
            </container>
            <configuration>
              <dir>
                ${project.build.directory}/tomcat5x/container
              </dir>
            </configuration>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
この設定を行った後 "mvn package" を実行すると Tomcat 5 の起動とディプロイを CARGO が自動的に行ってくれる。 Tomcat 5 は CARGO が勝手にダウンロードして、$PROJECT_HOME/target/tomcat5x/container にインストールしてくれる。 "mvn clean" で target が削除されてもその次の実行時に再度ダウンロードされる。 Tomcat が起動しているかどうかは "http://localhost:8080/cargocpc/" にアクセスすることで確認できる。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 15, 2006

[Maven] Maven2 で JAR の Manifest ファイルを設定する方法をメモ

Maven2 の JAR アーカイバ(maven-jar-plugin) における Manifest 関連の設定をメモ。

Manifest 関連の設定方法

JAR アーカイバの Manifest 関連の設定は pom.xml に記述する。

<model>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>jp.in_vitro.dummy.Main</mainClass>
              <packageName>jp.in_vitro.dummy</packageName>
              <addClasspath>true</addClasspath>
              <addExtensions>true</addExtensions>
              <classpathPrefix>lib</classpathPrefix>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</model>

Manifest 関連の設定項目

設定項目 設定値 解説
addClasspath "true" / "false" "true" が指定された場合、pom.xml の dependencies に従い Class-Path が出力される。
addExtensions "true" / "false" "true" が指定された場合、pom.xml の dependencies に従い拡張情報(各 dependency の詳細情報)が出力される。
classpathPrefix 任意の文字列 addClasspath に "true" が設定された際、各 Classpath エントリに指定された文字列が接頭語として付加される。例えば classpathPrefix に "lib" を指定すると、Class-Path の各エレメントは "lib/commons-logging.jar" の様になる。
mainClass 任意のクラス名(FQCN) JAR のメインクラスを指定する。Manifest ファイルの Main-Class に出力される。
packageName 任意のパッケージ名 JAR のパッケージを指定する。Manifest ファイルの Package に出力される。

Manifest 関連設定の実体

pom.xml で指定した Manifest 関連の設定は maven-archiver (maven-archiver-2.0-beta-3.jar など) にある org.apache.maven.archiver.ManifestConfiguration というクラスが保持する。 ManifestConfiguration には以下のフィールドが用意されていて、ここに設定内容がインジェクションされる。

  private String mainClass;
  private String packageName;
  private String addClasspath;
  private String addExtensions;
  private String classpathPrefix;

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 28, 2005

[Maven] maven-metadata.xml の読み込み方

先日作成した MavenRepositoryBrowser で使用した maven-metadata.xml の読み込み方法をメモ。

maven-metadata.xml 読み込みの実行環境構築

  1. maven-repository-metadata-2.0.jar をクラスパスに追加。
  2. plexus-utils-1.0.4.jar をクラスパスに追加。

サンプルコード

org.apache.maven.artifact.repository.metadata.Metadata というクラスが Metadata を表す。 ストリーム等から maven-metadata.xml を読み込み Metadata を生成するのが org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader。 この 2 つのクラスを利用すると苦も無く maven-metadata.xml を読み込むことができる。便利。

    public Metadata readMetadata(final String groupId,
            final String artifactId, final String version) throws Exception {
        String mavenMetadataRelativePath = "/" + groupId.replaceAll("\\.", "/")
                + "/" + artifactId + "/" + version + "/" + "maven-metadata.xml";
        String repositoryRootPath = this.repositoryRoot.toExternalForm();
        if (!repositoryRootPath.endsWith("/")) {
            repositoryRootPath = repositoryRootPath + "/";
        }

        URL mavenMetadataURL = new URL(repositoryRootPath
                + mavenMetadataRelativePath);
        Metadata metadata = this.readMetadata(mavenMetadataURL);
        return metadata;
    }

    protected Metadata readMetadata(final URL url) throws Exception {

        Metadata metadata = null;
        InputStream is = null;
        Reader source = null;
        try {
            URLConnection connection = url.openConnection();
            is = connection.getInputStream();
            source = new InputStreamReader(is);

            MetadataXpp3Reader reader = new MetadataXpp3Reader();
            metadata = reader.read(source);
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
            } finally {
                if (source != null) {
                    source.close();
                }
            }
        }
        return mavenMetadata;
    }

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 27, 2005

[Maven] pom.xml の読み込み方

先日作成した MavenRepositoryBrowser で使用した pom.xml の読み込み方法をメモ。

pom.xml 読み込みの実行環境構築

  1. maven-model-2.0.jar をクラスパスに追加。
  2. plexus-utils-1.0.4.jar をクラスパスに追加。

サンプルコード

org.apache.maven.model.Model というクラスが POM を表す。 ストリーム等から pom.xml を読み込み Model を生成するのが org.apache.maven.model.io.xpp3.MavenXpp3Reader。 この 2 つのクラスを利用すると苦も無く pom.xml を読み込むことができる。便利。

    public Model readModel(final String groupId, final String artifactId,
            final String version) throws Exception {

        // Maven2 リポジトリのディレクトリ構成に合わせて URL を生成。
        String pomRelativePath = "/" + groupId.replaceAll("\\.", "/") + "/"
                + artifactId + "/" + version + "/" + artifactId + "-" + version
                + ".pom";
        String repositoryRootPath = this.repositoryRoot.toExternalForm();
        if (!repositoryRootPath.endsWith("/")) {
            repositoryRootPath = repositoryRootPath + "/";
        }

        // pom.xml の読み込み。
        URL pomURL = new URL(repositoryRootPath + pomRelativePath);
        Model model = this.readModel(pomURL);

        return model;
    }

    protected Model readModel(final URL url) throws Exception {
        Model model = null;
        InputStream is = null;
        Reader source = null;
        try {
            // 指定された URL からデータを取得
            URLConnection connection = url.openConnection();
            is = connection.getInputStream();
            source = new InputStreamReader(is);

            // pom.xml の解析
            MavenXpp3Reader reader = new MavenXpp3Reader();
            model = reader.read(source);
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
            } finally {
                if (source != null) {
                    source.close();
                }
            }
        }
        return model;
    }

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 24, 2005

[Maven] Maven2 のリポジトリにある jar の依存関係を見たい!!

Maven2 はリポジトリに各種ライブラリが揃っていて有難いのだが、 jar 同士の依存関係は各々の pom ファイルに散っているので意外と追いかけづらい。 「struts-1.2.4.jar が依存しているライブラリをとりあえず見てみたい」等という状況になると、 struts-1.2.4.pom を見て → commons-beanutils-1.6.1.pom を見て → commons-logging-1.0.pom を見て・・・ と頑張って辿ることになる。 段々面倒になってきたので、リポジトリ内の pom の依存関係を追いかけるツールを作ってみた。

Maven2 Repository Browser

↓のリンクをクリックすると Java Web Start で Maven2 Repository Browser が起動する。
Maven2 Repository Browser を起動

とりあえず半日ちょいで作ったお気軽ツールなので、マトモに動くかどうか不明。 動かない場合は諦めが肝心。ちなみに Maven1 のリポジトリは面倒なので未対応。

Maven2 Repository Browser 使用上の注意

このソフトは・・・

  1. Maven2 のリポジトリから pom ファイルを読み込み、dependencies を追いかける。
  2. オレオレ証明書で署名されている。 → 正式な証明書を所有していない && 署名しないとセキュリティ制約で動作しないため
  3. 外部へのネットワークアクセスを要求する。 → Maven2 のリポジトリにアクセスするため
このソフトを利用する際には・・・
  1. J2SE 5.0 以上の JVM が必要。
  2. ネットワークのアクセス権限が必要。
  3. Maven2 の知識が必要。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 09, 2005

[Maven] Continuum にチャレンジ

Continuum とは

Continuum は、Maven2、Maven、Ant などに対応した継続的インテグレーションツール。 実際のところはシェルスクリプトをキックできるようになっているので、他のビルドツールを使用していても大丈夫。 Apache Maven プロジェクトの一環として開発が行われている。 先日ついにバージョン 1.0 がリリースされたので実際に試してみた。

Continuum 公式サイト
http://maven.apache.org/continuum/

Continuum の実行環境構築

JDK(1.4以上) 及び開発に使用している JDK、SCM クライアント、ビルドツールが既にインストールされていることが前提。

  1. ダウンロードページから continuum-1.0-bin.tar.gz をダウンロード
  2. Continuum をインストール
    # tar zxvf ./continuum-1.0-bin.tar.gz
    # mv ./continuum-1.0 /opt
    # ln -s /opt/continuum-1.0/ /opt/continuum
    
  3. JAVA_HOME を設定
    # export JAVA_HOME=/opt/jdk15
    # export PATH=$JAVA_HOME/bin:$PATH
    # java -version
    java version "1.5.0_05"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_05-b05)
    Java HotSpot(TM) Client VM (build 1.5.0_05-b05, mixed mode, sharing)
    
  4. /opt/continuum/bin/linux/run.sh の先頭の方に "PATH=/opt/maven2/bin:$PATH" を追記(開発に Maven2 を使っている場合)。
  5. Continuum を起動する。初回起動にはかなり時間がかかる(Pen4 2.4G 上の VMWare で数分かかった)ので気長に待つ。2 回目からは速くなるのでじっとガマン。
    # /opt/continuum/bin/linux/run.sh console
    
    ※run.sh のパラメータには通常 start を使用するが、初回はエラーが出る可能性があるのでフォアグラウンドで実行される console を使用すると便利。
  6. http://localhost:8080/continuum/ にアクセスして動作確認を行う。初回起動時に管理者用アカウントの設定画面が表示される。
    [管理者用アカウント設定画面] [初期画面]

Continuum へのプロジェクトの追加

Maven2 + Subversion で管理しているプロジェクトを Continuum に追加してみる。

pom.xml の編集

pom.xml に scm と ciManagement を追記する。

<model>
  <scm>
    <connection>scm:svn:http://svn.example.com/repos/MyProject/trunk/</connection>
    <developerConnection>scm:svn:http://svn.example.com/repos/MyProject/trunk/</developerConnection>
    <url>http://svn.example.com/repos/MyProject/</url>
  </scm>

  <ciManagement>
    <system>continuum</system>
    <notifiers>
      <notifier>
        <type>mail</type>
        <configuration>
          <address>me@example.com</address>
        </configuration>
      </notifier>
    </notifiers>
  </ciManagement>
</model>

Continuum へ pom.xml を登録

"Add Project" > "Maven 2.0+ Project" で pom.xml をアップロードする。
[pom.xml のアップロード] [プロジェクトが登録されたところ]

ビルドの実行

"Continuum" > "Show Projects" から該当プロジェクトの "Build Now" をクリックして強制的にビルドを実行する。
[ビルド結果一覧]

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 31, 2005

[Maven] Cruise Control と Maven2 を連携させたい

Maven2 で管理しているプロジェクトを Cruise Control と連携させたいのだが、残念なことに最新の Cruise Control 2.3.1 でも未だ Maven2 には対応していないみたい。

仕方がないので、Cruise Control 用の Maven2Builder Plugin を作ってみた。 作ってみたと言っても、Maven 1.x 用の Builder をちょっと変えただけなのだけれども。

またもやお約束ですが、この Plugin を利用して何らかの不利益を被ったとしても一切補償はできません。 SCM などできちんと管理されたソースコードで試行して品質をご自身で判断してからご利用ください。

ダウンロード

Cruise Control 用 Maven2Builder Plugin

使い方

  1. Cruise Control 2.3.1 の環境を準備する。
  2. 上から ZIP アーカイブをダウンロードする。
  3. 上のアーカイブから maven2builder-1.0.0.jar を取り出して $CC_HOME/lib にコピーする。
  4. $CC_HOME/cruisecontrol.sh を編集する。
    • JAVA_HOME を設定
    • CRUISE_PATH に $LIBDIR/maven2builder-1.0.0.jar を追加
  5. $CC_HOME/config.xmlを編集する。
    • plugin に jp.in_vitro.cruisecontrol_plugin.maven2builder.Maven2Builder を登録。name は "maven2"
    • builder に maven2 を指定
<cruisecontrol>
  <plugin name="maven2" 
          classname="jp.in_vitro.cruisecontrol_plugin.maven2builder.Maven2Builder"/>

  <project name="Gadgets">
    <listeners>
      <currentbuildstatuslistener file="/home/cruisecontrol/logs/Gadgets/status.txt" />
    </listeners>

    <bootstrappers>
      <svnbootstrapper localWorkingCopy="/home/cruisecontrol/projects/Gadgets" />
    </bootstrappers>

    <modificationset quietperiod="30" >
      <svn localWorkingCopy="/home/cruisecontrol/projects/Gadgets"/>
    </modificationset>

    <schedule interval="300" >
      <maven2 mavenscript="/opt/maven2/bin/mvn"
              pom="/home/cruisecontrol/projects/Gadgets/pom.xml"
              goal="test"/>
    </schedule>

    <log>
      <merge dir="/home/cruisecontrol/projects/Gadgets/target/surefire-reports"/>
    </log>

  </project>
</cruisecontrol>

トラブルシューティング

Q. Cruise Control の設定方法が分かりません。
A. Cruise Control のマニュアルをご覧ください。
Q. 動きません。
A. 管理者の必要最低限の機能しか実装していません。あきらめてください。

参考サイト

Cruise Control
http://cruisecontrol.sourceforge.net/
Cruise Control への Plugin 登録方法
http://cruisecontrol.sourceforge.net/main/plugins.html#registration

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 29, 2005

[Maven] Maven2 用 Jalopy Plugin

Maven2 から Jalopy(*1) を実行する Plugin を書いてみた。 居るとも思えないけれど、もし欲しい人がいたらどうぞ。 お約束ですが、この Plugin を利用して何らかの不利益を被ったとしても一切補償はできません。 SCM などできちんと管理されたソースコードで試行して品質をご自身で判断してからご利用ください。

*1 Java 用のコードフォーマッタ

ダウンロード

Maven2 用 Jalopy Plugin

使い方

  1. 上から ZIP アーカイブをダウンロードする。
  2. プロジェクトで使用しているリモートリポジトリ内の適切な位置に上記アーカイブを解凍する。
  3. pom.xml を編集してビルドライフサイクルを変更する。
<model>
  <build>
    </plugins>
      <plugin>
        <groupId>in-vitro</groupId>
        <artifactId>maven-jalopy-plugin</artifactId>
        <configuration>
          <convention>${basedir}/jalopy-rule.xml</convention>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>format</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</model>
    

トラブルシューティング

Q. ダウンロードできません
A. あきらめてください。管理者が配布を中止しているかもしれません。
Q. 上手く動作しません
A. あきらめてください。こんなアヤシゲな Plugin を無理に利用する必要はありません ;-)

参考サイト

Maven2 の Plugin 設定方法
http://maven.apache.org/maven2/guides/plugin/guide-java-plugin-development.html
Jalopy 公式サイト
http://jalopy.sourceforge.net/
Jalopy マニュアル
http://jalopy.sourceforge.net/manual.html

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 24, 2005

[Maven] Maven2 Plugin の作り方

Maven2 Plugin 開発手順

  1. org.apache.maven.plugin.AbstractMojo を継承したクラスを作成する。
  2. pom.xml を作成する。

ディレクトリ構成

PROJECT_HOME
  ├src
  │ ├main
  │ │ └java
  │ │   └jp
  │ │    └in_vitro
  │ │       └hoge_plugin
  │ │          └HogeMojo.java ・・・ plugin 本体
  │ └test
  │   └java
  └pom.xml ・・・ plugin ビルド用 pom

pom.xml

<model>
  <modelVersion>4.0.0</modelVersion>
  <groupId>in-vitro</groupId>
  <artifactId>maven-hoge-plugin</artifactId>
  <packaging>maven-plugin</packaging>
  <version>1.0.0</version>

  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-tools-api</artifactId>
      <version>2.0</version>
    </dependency>
  </dependencies>
</model>

HogeMojo.java

package jp.in_vitro.hoge_plugin;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;

/**
 * @goal goalname
 * @description do something
 */
public class HogeMojo extends AbstractMojo {

    /**
     * プロジェクトのベースディレクトリ。
     *
     * @parameter expression="${basedir}"
     * @required
     */
    private File basedir;

    /**
     * {@link HogeMojo HogeMojo} を生成する。
     */
    public HogeMojo() {
        super();
    }

    /**
     * このプラグインを実行する。
     * このメソッドは Maven から呼び出される。
     * 
     * @throws MojoExecutionException プラグイン実行中にエラーが発生した場合。
     */
    public void execute() throws MojoExecutionException {
      // do something.
    }
}

参考サイト

Guide to Developing Java Plugins
http://maven.apache.org/maven2/guides/plugin/guide-java-plugin-development.html
Maven 標準 Plugin のソースコード
http://svn.apache.org/viewcvs.cgi/maven/components/trunk/maven-plugins/

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 23, 2005

[Maven] Build Task の自動化

プロジェクトの Build Task を自動化する方法を考えてみる。 Build Task は、プロジェクト毎に大同小異なのでベースは固まっていて且つカスタマイズ性が高い、というのがベスト。

Maven2 では、プロジェクトのライフサイクルが規定されている。 ライフサイクルは複数のフェーズから成っていて、それぞれのフェーズに任意の Goal を割り当てることができる。そのため、上記の要件をきちんと満たしてくれている。

デフォルト状態で規定されているライフサイクルは以下の通り。(maven-core-2.0.jar$META-INF/plexus/components.xml から抜粋)

<lifecycles>
  <lifecycle>
    <id>default</id>
    <phases>
      <phase>validate</phase>
      <phase>initialize</phase>
      <phase>generate-sources</phase>
      <phase>process-sources</phase>
      <phase>generate-resources</phase>
      <phase>process-resources</phase>
      <phase>compile</phase>
      <phase>process-classes</phase>
      <phase>generate-test-sources</phase>
      <phase>process-test-sources</phase>
      <phase>generate-test-resources</phase>
      <phase>process-test-resources</phase>
      <phase>test-compile</phase>
      <phase>test</phase>
      <phase>package</phase>
      <phase>integration-test</phase>
      <phase>verify</phase>
      <phase>install</phase>
      <phase>deploy</phase>
    </phases>
  </phases>
</lifecycle>
それぞれのフェーズの用途は Introduction to the Build Lifecycle で解説されている。 ここを適当にカスタマイズして Build Task を組み立てることができそう。

また、↓の様に独自のライフサイクルとフェーズを定義することもできる。

<lifecycle>
  <id>clean</id>
  <phases>
    <phase>pre-clean</phase>
    <phase>clean</phase>
    <phase>post-clean</phase>
  </phases>
  <default-phases>
    <clean>org.apache.maven.plugins:maven-clean-plugin:clean</clean>
  </default-phases>
</lifecycle>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 22, 2005

[Maven] Maven2 まとめ

Maven2 が正式リリースされたので、まとめ。

関連サイト

公式サイト
http://maven.apache.org/maven2/
デフォルトのリモートリポジトリ
http://repo1.maven.org/maven2
プラグイン一覧
http://maven.apache.org/maven2/plugins/index.html

インストール

  1. ここから Maven2 をダウンロードする
  2. アーカイブを適当な位置(ex. /opt/maven-2.0/)に解凍
  3. 環境変数 MAVEN_HOME を設定(ex. export MAVEN_HOME=/opt/maven-2.0)
  4. 環境変数 PATH を設定(ex. export PATH=$MAVEN_HOME/bin:$PATH)
  5. 起動確認 "mvn --version"
$ tar zxvf ./maven-2.0-bin.tar.gz
$ export MAVEN_HOME=/opt/maven-2.0
$ export PATH=$MAVEN_HOME/bin:$PATH
$ mvn --version
Maven version: 2.0

※公式なインストール方法(?)はこちら→Installation Instructions

プロジェクトの作成

  1. groupId, artifactId を考える
  2. archetype プラグインを実行(ex. mvn:create -DgroupId=in-vitro -DartifactId=sample)
  3. 生成されたプロジェクトを確認。カレントディレクトリ内に指定した artifactId と同名のプロジェクトディレクトリが生成されている。

archetype プラグイン実行時に指定可能なパラメータはこちら → archetype:create

※artifactId はプロジェクト成果物となるモジュール(?)のID。groupId は artifactId をグルーピングする際のID。

$ mvn archetype:create -DgroupId=in-vitro -DartifactId=sample
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] artifact org.apache.maven.plugins:maven-archetype-plugin: checking for up
dates from central
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-archet
ype-plugin/1.0-alpha-3/maven-archetype-plugin-1.0-alpha-3.pom
1K downloaded
Downloading: http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-archet
ype-plugin/1.0-alpha-3/maven-archetype-plugin-1.0-alpha-3.jar
6K downloaded
[INFO] -------------------------------------------------------------------------
---
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:create] (aggregator-style)
[INFO] -------------------------------------------------------------------------
---
Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-archetype-core
/1.0-alpha-3/maven-archetype-core-1.0-alpha-3.pom
1K downloaded
Downloading: http://repo1.maven.org/maven2/org/apache/maven/maven-archetype/1.0-
alpha-3/maven-archetype-1.0-alpha-3.pom
661b downloaded

  ...snip...

[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating Archetype: maven-archetype-quicks
tart:RELEASE
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: in-vitro
[INFO] Parameter: outputDirectory, Value: C:\_workspace\sample
[INFO] Parameter: packageName, Value: in-vitro
[INFO] Parameter: package, Value: in-vitro
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: artifactId, Value: sample
[INFO] ResourceManager : found archetype-resources/pom.xml with loader org.codeh
aus.plexus.velocity.ContextClassLoaderResourceLoader
[INFO] ********************* End of debug info from resources from generated POM
 ***********************
[INFO] ResourceManager : found archetype-resources/src/main/java/App.java with l
oader org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader
[INFO] ResourceManager : found archetype-resources/src/test/java/AppTest.java wi
th loader org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader
[INFO] Archetype created in dir: C:\_workspace\sample
[INFO] -------------------------------------------------------------------------
---
[INFO] BUILD SUCCESSFUL
[INFO] -------------------------------------------------------------------------
---
[INFO] Total time: 1 minute 35 seconds
[INFO] Finished at: Sat Oct 29 10:40:08 JST 2005
[INFO] Final Memory: 4M/7M
[INFO] -------------------------------------------------------------------------
---

$

pom.xml を眺めてみる

archetype プラグインが生成したプロジェクトディレクトリ(上の例では in-vitro )の直下に pom.xml ファイルが生成されている。 pom.xml はプロジェクトに関する各種設定を記述するファイルで Project Descriptor と呼ばれる。

pom.xml のフォーマットはこちら → Project Descriptor

<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>in-vitro</groupId>
  <artifactId>sample</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>

プロジェクトをビルドしてみる

Maven2 ではビルドライフサイクルという概念が定義されている。 Maven2 実行時に規定されたビルドライフサイクルを指定することで、予め定義された順序でプラグインが逐次実行される。 ビルドライフサイクルには compile, package, install, deploy などが規定されている。

プロジェクトのビルドする場合、"mvn compile" といった様に Maven2 にビルドライフサイクルを指定する。

ビルドライフサイクルに関する詳細はこちら → Introduction to the Build Lifecycle

$mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building Maven Quick Start Archetype
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[WARNING] POM for: 'commons-io:commons-io:pom:1.0' does not appear to be valid.
Its will be ignored for artifact resolution.

Reason: Failed to validate POM


[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
Compiling 1 source file to /home/in-vitro/projects/sample/target/classes
[INFO] -------------------------------------------------------------------------
---
[ERROR] BUILD FAILURE
[INFO] -------------------------------------------------------------------------
---
[INFO] Compilation failure

/home/in-vitro/projects/sample/src/main/java/in-vitro/App.java:[1,10] ';' があり
ません。


[INFO] -------------------------------------------------------------------------
---
[INFO] For more information, run Maven with the -e switch
[INFO] -------------------------------------------------------------------------
---
[INFO] Total time: 2 seconds
[INFO] Finished at: Sat Oct 29 11:00:58 JST 2005
[INFO] Final Memory: 3M/5M
[INFO] -------------------------------------------------------------------------
---

$

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |