-antに変わるビルドツールとして急成長中。とはいってもantも完全に駆逐されたわけじゃないけどね。 #contents *基本概念 [#j27ab3dc] プロジェクトで必要となるタスクを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 **構成 [#m766f357] 親pom.xmlのDependencyManagementセクションにて、各サブモジュールで使う可能性があるものを列挙しておく。 ***pomが競合したとき [#sfae5048] 複数の親pomが混在する場合は、一番近い依存性定義が優先される。 以下のプロジェクトではD1.0が利用される。 |A-B-C-D2.0|4階層下にある| |A-E-D1.0|3階層下にある。こちらのほうが近い| *jarの中に依存ライブラリ [#a9f7aa68] maven-shade-plugin *インストール [#m2e6660d] Javaとmvnへのパスが通っていればよし。Eclipseならm2e(昔のm2eclipse)が標準。J2EEパックなら標準インストール済み。m2eを使うときにはm2eプロファイルが自動的に読まれる。 **MavenのバージョンとJDKのバージョン対応表 [#nb34a01b] |maven|JDK| |3.3|1.7以上| |3.2|1.6以上| |3.1|1.5以上| |2.2.1|1.5以上| |2.1.0|1.4以上| *プロジェクトの生成 [#wc7483fe] -テンプレートに合わせてディレクトリを作ってくれる。以下のコマンドで種類を選択できる。1を選ぶとwebapps mvn archetype:generate **Webプロジェクトのときの依存性 [#q3c8d095] -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の記載 [#b63e739e] **基本情報 [#z8728243] **変数の定義と利用 [#uab16306] <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の指定 [#i0d5434b] 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> **リポジトリ情報 [#u81855ac] -関連モジュールをローカルリポジトリにダウンロードさせる $ mvn dependency:go-offline 3種類定義する。 +ダウンロードリポジトリ +パッケージを作成したときにアップロードするリポジトリ +プラグインのダウンロードリポジトリ 三種類なので一か所だけ変更しても、残りは変更されておらずはまったので注意。 ***依存関係jar表示 [#ic27e4d5] mvn dependency:tree -Dverboseオプションを付けるとより詳細な情報を表示できる。 **リポジトリごとのTimeout [#ze91b2bb] -settings.xmlで行う。 **リポジトリポリシー [#na6cd37a] -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> **ローカルリポジトリ [#d6de3abc] デフォルトはユーザーの.m2だが、settings.xmlで設定可能 <localRepository>/path/to/local/repo</localRepository> **Eclipse上での操作 [#t584a242] ***既存プロジェクトをmavenプロジェクトに変更 [#g652987d] 右クリックして構成→convert to maven project ***新規作成 [#i689ee35] 右クリックして新規作成→Maven→Maven Project *プラグイン [#n4c77927] **maven-release-plugin [#bf1d00ee] 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/ *注意点など [#l17c5f17] 特別な設定をしない限り、jarファイルをネット経由で持ってくるので接続が必要。 *主要操作など [#l4882bbb] **プロジェクト作成 [#gec98655] -下記コマンドでディレクトリ構成含め勝手に作ってくれる 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> **コンパイル [#b0135ff3] -テストコンパイルするにはappディレクトリに移動して以下のコマンド mvn compile バージョンの指定はプロパティで行う。 maven.compiler.source, maven.compiler.target **テスト [#gedd4ae5] -JUnitテストするには mvn test -特定のクラスのみテストする mvn test -Dtest={テストクラス名} **パッケージ作成 [#nc81a40d] mvn package **リリース [#f79b28dc] -ローカルリポジトリにリリースしてみる mvn install どのコマンドも初回実行時には関連jarをごっそりダウンロードするので時間はかかる。二回目以降は早い。 **リモートリポジトリに配備 [#n41fc747] -インストール先の情報はdistributionManagementセクションで定義しておく。たいていの場合アップロードには認証が必要なので、リポジトリIDに対してsettings.xmlにパスワードを設定する。 mvn deploy -手動デプロイ(jar) -手動デプロイ(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 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プロジェクト作成 [#k4904694] mvn eclipse:eclipse **どのprofile,pom,settingsが有効なのか出力 [#he3d7e2b] mvn help:active-profiles mvn help:effective-pom mvn help:effective-settings settings.xmlは~/.m2におかないと自動では読み込んではくれないので注意。 **リポジトリのタイムアウト設定 [#j18321a6] http://d.hatena.ne.jp/Kazuhira/20130623/1371978072 *文字列置換 [#xdcc2225] フィルタリングという。以下のURLを参照せよ http://www.limy.org/program/java/maven/filtering.html *TIPS [#u28415a0] |テストをスキップする|mvnコマンドに、 -Dmaven.test.skip=true を加える。| |メモリの調整|環境変数MAVEN_OPTS=-Xmx512mを設定する。デフォルトは256M| *トラブルシューティング [#p0d0c9d3] |内容|対策| |Missing artifact|| |jarが古いまま|バージョンが同じだと新しいのを取得しないので、ローカルのjarを消す| |resolution will not be reattempted until the update interval of xxx|ローカルキャッシュの有効期限が切れるまでローカルを見続けるのでローカルキャッシュを消す| |リポジトリを変更したのに旧リポジトリを見に行くまたは即タイムアウトになる|ローカルキャッシュが原因の可能性が高い.lastUpdatedファイルを消すともう一度リモートリポジトリにアクセスしに行く| |ソースjarができない|mvn source:jar| -リポジトリ参照記録は以下のファイルに存在する。 artifact-versionno.pom.lastUpdated *リポジトリの検索 [#n491dc7a] http://mvnrepository.com/ *リポジトリソフトウェアの比較 [#q52de179] +Apache Archiva +Sonatype nexus +Artifactory http://binary-repositories-comparison.github.io/ *用語など [#af2685e7] |用語名|説明|備考| |artifactId|成果物のこと|人工物の意味から来ているらしい| |groupId|パッケージ階層とほぼ同じ|| |プロジェクトサイト|mavenにて自動生成できるHTMLページ|JavaDocやテストカバレッジ| |Apache archiva|複数のmavenリポジトリをまとめるProxy的役割を果たす| |nexus|archivaと同じく、複数のmavenリポジトリをまとめるProxy的役割を果たす| *リポジトリソフト [#c86b3435] Archiva,sonatype nexus,Artifactoryがある。比較表がある。 http://docs.codehaus.org/display/MAVENUSER/Maven+Repository+Manager+Feature+Matrix **nexus(sonatype nexus) [#q4b0395e] ***nexus インストール手順 [#ude664eb] warバンドルがなくなってしまった。nexusディレクトリ以下をTOMCAT_HOME/webappsに突っ込んだが、NoClassDefFoundErrorが出たので、上位のlibディレクトリのjarをnexus/WEB-INF/libにつっこんで起動したところ無事成功。ユーザーディレクトリにsonatype-workディレクトリを作るので注意。またコンパイルバージョンがかなり最新のものを使っているのでJDK6の場合は2.5までしか使えない。 環境変数PLEXUS_NEXUS_WORKでワークディレクトリの設定をする ***設定ファイル [#b5b410dd] PLEXUS_NEXUS_WORK/confにある。 |security.xml|認証系情報| |nexus.xml|リポジトリ情報| ***nexusバージョンアップ [#v457d082] 本体だけでOK。 **リポジトリの設定 [#lf83329d] Proxy,3rdParty,Hosted,Virtualの種類がある。 一般公開されているリポジトリのProxyとして使うならProxyだが、初期状態で設定されているので特に追加は不要だろう。「Download Remote Indexes」の設定をTrueにしておくとNexusの動いているマシンにダウンロードしておいてくれる。OracleのODBCドライバのような一般公開リポジトリに存在しない場合は3rdParyリポジトリに手動でアップロードする。自作のアプリのアップロード場所はHostedにする。 *モジュールの考え方 [#e40bb458] http://blog.livedoor.jp/android1009/archives/24341372.html *トラブルシューティング [#t941083a] Could not find the main class: org.codehaus.plexus.classworlds.launcher.Launcher. M2_HOMEを正しく設定しないと出てしまう。 #counter