• antに変わるビルドツールとして急成長中。とはいってもantも完全に駆逐されたわけじゃないけどね。

基本概念

プロジェクトで必要となるタスクをMavenが定義する各フェーズ(プロジェクト作成、コンパイル、テスト、ドキュメント、パッケージング)で実施できるようにしている。

各フェーズはmavenプラグインで実装されており、初回実行時にダウンロードするためネットワーク接続が必要。

プロジェクト作成mvn archetype:create
クリーンmvn clean
コンパイルmvn compile
クラスを指定して実行mvn exec:java -Dexec.mainClass=クラス名
依存jarをtarget/dependencyにコピーmvn dependency:copy-dependencies
  • JRE1.6以上から、ワイルドカードが使えるようになった。
java -cp 'target/dependency/*.jar' hogehoge

構成

親pom.xmlのDependencyManagementセクションにて、各サブモジュールで使う可能性があるものを列挙しておく。

pomが競合したとき

複数の親pomが混在する場合は、一番近い依存性定義が優先される。

以下のプロジェクトではD1.0が利用される。

A-B-C-D2.04階層下にある
A-E-D1.03階層下にある。こちらのほうが近い

jarの中に依存ライブラリ

maven-shade-plugin

インストール

Javaとmvnへのパスが通っていればよし。Eclipseならm2e(昔のm2eclipse)が標準。J2EEパックなら標準インストール済み。m2eを使うときにはm2eプロファイルが自動的に読まれる。

MavenのバージョンとJDKのバージョン対応表

mavenJDK
3.31.7以上
3.21.6以上
3.11.5以上
2.2.11.5以上
2.1.01.4以上

プロジェクトの生成

  • テンプレートに合わせてディレクトリを作ってくれる。以下のコマンドで種類を選択できる。1を選ぶとwebapps
mvn archetype:generate

Webプロジェクトのときの依存性

  • servletapi 3.1
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
  • JSTL1.2
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jstl-impl</artifactId>
    <version>1.2</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

pom.xmlの記載

基本情報

変数の定義と利用

   <properties>
       <arbitrary.property.a>This is some text</arbitrary.property.a>
       <hibernate.version>3.3.0.ga</hibernate.version>
   </properties>
   ...
   <dependencies>
       <dependency>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate</artifactId>
           <version>${hibernate.version}</version>
  • settings.xmlにpropeties定義できるところがあって、別ファイルに持たすことも可能。

profileの指定

mvn help:active-profilesで現状有効なprofileを見ることができる。

<profile>
 <id>profile-A</id>
 <properties>
   <value>AAA</value>
 </properties>
</profile>

<profile>
 <id>profile-B</id>
 <properties>
   <value>BBB</value>
 </properties>
</profile>

リポジトリ情報

  • 関連モジュールをローカルリポジトリにダウンロードさせる

$ mvn dependency:go-offline

3種類定義する。

  1. ダウンロードリポジトリ
  2. パッケージを作成したときにアップロードするリポジトリ
  3. プラグインのダウンロードリポジトリ

三種類なので一か所だけ変更しても、残りは変更されておらずはまったので注意。

依存関係jar表示

mvn dependency:tree
  • Dverboseオプションを付けるとより詳細な情報を表示できる。

リポジトリごとのTimeout

  • settings.xmlで行う。

リポジトリポリシー

  • pom.xmlの定義部分で行う。uniqueVersion=trueに指定するとリポジトリに同名バージョンがあった場合は上書きされる。falseだとタイムスタンプごとのファイルがたくさんできてしまう。
    <!-- distributionManagementはアップロード先のリポジトリを指定する -->
    <distributionManagement>
        <repository>
            <uniqueVersion>true</uniqueVersion>
            <id>release_repo</id>
            <name>release_repository</name>
            <url>http://example.com/maven/release</url>
        </repository>
        <snapshotRepository>
            <uniqueVersion>false</uniqueVersion>
            <id>snapshot_repo</id>
            <name>snapshot_repository</name>
            <url>http://example.com/maven/snapshot</url>
        </snapshotRepository>
    </distributionManagement>

ローカルリポジトリ

デフォルトはユーザーの.m2だが、settings.xmlで設定可能

<localRepository>/path/to/local/repo</localRepository>

Eclipse上での操作

既存プロジェクトをmavenプロジェクトに変更

右クリックして構成→convert to maven project

新規作成

右クリックして新規作成→Maven→Maven Project

プラグイン

maven-release-plugin

pomのバージョンアップやタグの設定を自動でやってくれるプラグイン

http://www.nulab.co.jp/kousei/chapter6/05.html

  • pluginを取ってくるrepositoryはplugin-repositoryとして別に定義する。jarの配置先もDistribution Repository。setting.xmlでもリポジトリ定義できるけど、実行環境ごとに設定する羽目になるのでお勧めしない。
wagonファイル転送プラグイン
releaseリリース作業用プラグイン
resourceリソースファイルコピーや文字列置換
execコマンド実行
surefireテスト実施、結果レポート作成

プラグインリポジトリは以下に設定する。

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

注意点など

特別な設定をしない限り、jarファイルをネット経由で持ってくるので接続が必要。

主要操作など

プロジェクト作成

  • 下記コマンドでディレクトリ構成含め勝手に作ってくれる
mvn archetype:create -DgroupId=com.rutake.sample -DartifactId=app -Dversion=0.0.1
  • warなら以下の通り
mvn archetype:generate -DgroupId=com.rutake.sample -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
  • pom.xmlには依存関係がないのでServlet系を利用するなら以下のdependencyを入れる
 <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.3</version>
    <scope>provided</scope>
</dependency>

コンパイル

  • テストコンパイルするにはappディレクトリに移動して以下のコマンド
mvn compile

バージョンの指定はプロパティで行う。

maven.compiler.source, maven.compiler.target

テスト

  • JUnitテストするには
mvn test
  • 特定のクラスのみテストする
mvn test -Dtest={テストクラス名}

パッケージ作成

mvn package

リリース

  • ローカルリポジトリにリリースしてみる
    mvn install

どのコマンドも初回実行時には関連jarをごっそりダウンロードするので時間はかかる。二回目以降は早い。

リモートリポジトリに配備

  • インストール先の情報はdistributionManagementセクションで定義しておく。たいていの場合アップロードには認証が必要なので、リポジトリIDに対してsettings.xmlにパスワードを設定する。
mvn deploy
  • 手動デプロイ(jarとpom両方実施の必要あり)
mvn deploy:deploy-file -Durl=<アップロード先URL> -DrepositoryId=<リポジトリのID> -Dfile=<Jarファイルへのパス> -DgroupId=<グループID>  -DartifactId=<アーティファクトID> -Dversion=<バージョン> -Dpackaging=jar
  • 手動デプロイ(pom) -DgeneratePom=falseを入れないと勝手に内容書き換えるので超要注意!超凶悪!
mvn deploy:deploy-file -Dfile=<POMFILE>  -Durl=<リポジトリURL> -DrepositoryId=<リポジトリのID> -DgroupId=<グループID> -DartifactId=<アーティファクトID> -Dversion=<バージョン> -Dpackaging=pom -DgeneratePom=false
  • CURLでデプロイすることもできるらしい(nexusのHPより)

curl -u juven-test:****** https://oss.sonatype.org/service/local/staging/deploy/maven2/com/ juvenxu/ossrh-test/1.1/ossrh-test-1.1.pom --request PUT --data @pom.xml

eclipseプロジェクト作成

mvn eclipse:eclipse

どのprofile,pom,settingsが有効なのか出力

mvn help:active-profiles
mvn help:effective-pom 
mvn help:effective-settings

settings.xmlは~/.m2におかないと自動では読み込んではくれないので注意。

リポジトリのタイムアウト設定

http://d.hatena.ne.jp/Kazuhira/20130623/1371978072

文字列置換

フィルタリングという。以下のURLを参照せよ

http://www.limy.org/program/java/maven/filtering.html

TIPS

テストをスキップするmvnコマンドに、 -Dmaven.test.skip=true を加える。
メモリの調整環境変数MAVEN_OPTS=-Xmx512mを設定する。デフォルトは256M

トラブルシューティング

内容対策
Missing artifact
jarが古いままバージョンが同じだと新しいのを取得しないので、ローカルのjarを消す
resolution will not be reattempted until the update interval of xxxローカルキャッシュの有効期限が切れるまでローカルを見続けるのでローカルキャッシュを消す
リポジトリを変更したのに旧リポジトリを見に行くまたは即タイムアウトになるローカルキャッシュが原因の可能性が高い.lastUpdatedファイルを消すともう一度リモートリポジトリにアクセスしに行く
ソースjarができないmvn source:jar
  • リポジトリ参照記録は以下のファイルに存在する。

artifact-versionno.pom.lastUpdated

リポジトリの検索

http://mvnrepository.com/

リポジトリソフトウェアの比較

  1. Apache Archiva
  2. Sonatype nexus
  3. Artifactory

http://binary-repositories-comparison.github.io/

用語など

用語名説明備考
artifactId成果物のこと人工物の意味から来ているらしい
groupIdパッケージ階層とほぼ同じ
プロジェクトサイトmavenにて自動生成できるHTMLページJavaDocやテストカバレッジ
Apache archiva複数のmavenリポジトリをまとめるProxy的役割を果たす
nexusarchivaと同じく、複数のmavenリポジトリをまとめるProxy的役割を果たす

リポジトリソフト

Archiva,sonatype nexus,Artifactoryがある。比較表がある。

http://docs.codehaus.org/display/MAVENUSER/Maven+Repository+Manager+Feature+Matrix

nexus(sonatype nexus)

nexus インストール手順

warバンドルがなくなってしまった。nexusディレクトリ以下をTOMCAT_HOME/webappsに突っ込んだが、NoClassDefFoundErrorが出たので、上位のlibディレクトリのjarをnexus/WEB-INF/libにつっこんで起動したところ無事成功。ユーザーディレクトリにsonatype-workディレクトリを作るので注意。またコンパイルバージョンがかなり最新のものを使っているのでJDK6の場合は2.5までしか使えない。

環境変数PLEXUS_NEXUS_WORKでワークディレクトリの設定をする

設定ファイル

PLEXUS_NEXUS_WORK/confにある。

security.xml認証系情報
nexus.xmlリポジトリ情報

nexusバージョンアップ

本体だけでOK。

リポジトリの設定

Proxy,3rdParty,Hosted,Virtualの種類がある。 一般公開されているリポジトリのProxyとして使うならProxyだが、初期状態で設定されているので特に追加は不要だろう。「Download Remote Indexes」の設定をTrueにしておくとNexusの動いているマシンにダウンロードしておいてくれる。OracleのODBCドライバのような一般公開リポジトリに存在しない場合は3rdParyリポジトリに手動でアップロードする。自作のアプリのアップロード場所はHostedにする。

モジュールの考え方

http://blog.livedoor.jp/android1009/archives/24341372.html

トラブルシューティング

Could not find the main class: org.codehaus.plexus.classworlds.launcher.Launcher.

M2_HOMEを正しく設定しないと出てしまう。

Counter: 12459, today: 5, yesterday: 2

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-12 (月) 15:33:57