プロジェクトで必要となるタスクをMavenが定義する各フェーズ(プロジェクト作成、コンパイル、テスト、ドキュメント、パッケージング)で実施できるようにしている。
各フェーズはmavenプラグインで実装されており、初回実行時にダウンロードするためネットワーク接続が必要。
プロジェクト作成 | mvn archetype:create |
クリーン | mvn clean |
コンパイル | mvn compile |
クラスを指定して実行 | mvn exec:java -Dexec.mainClass=クラス名 |
依存jarをtarget/dependencyにコピー | mvn dependency:copy-dependencies |
java -cp 'target/dependency/*.jar' hogehoge
親pom.xmlのDependencyManagementセクションにて、各サブモジュールで使う可能性があるものを列挙しておく。
複数の親pomが混在する場合は、一番近い依存性定義が優先される。
以下のプロジェクトではD1.0が利用される。
A-B-C-D2.0 | 4階層下にある |
A-E-D1.0 | 3階層下にある。こちらのほうが近い |
maven-shade-plugin
Javaとmvnへのパスが通っていればよし。Eclipseならm2e(昔のm2eclipse)が標準。J2EEパックなら標準インストール済み。m2eを使うときにはm2eプロファイルが自動的に読まれる。
maven | JDK |
3.3 | 1.7以上 |
3.2 | 1.6以上 |
3.1 | 1.5以上 |
2.2.1 | 1.5以上 |
2.1.0 | 1.4以上 |
mvn archetype:generate
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
<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>
<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>
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種類定義する。
三種類なので一か所だけ変更しても、残りは変更されておらずはまったので注意。
mvn dependency:tree
<!-- 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>
右クリックして構成→convert to maven project
右クリックして新規作成→Maven→Maven Project
pomのバージョンアップやタグの設定を自動でやってくれるプラグイン
http://www.nulab.co.jp/kousei/chapter6/05.html
wagon | ファイル転送プラグイン |
release | リリース作業用プラグイン |
resource | リソースファイルコピーや文字列置換 |
exec | コマンド実行 |
surefire | テスト実施、結果レポート作成 |
プラグインリポジトリは以下に設定する。
http://repo1.maven.org/maven2/
特別な設定をしない限り、jarファイルをネット経由で持ってくるので接続が必要。
mvn archetype:create -DgroupId=com.rutake.sample -DartifactId=app -Dversion=0.0.1
mvn archetype:generate -DgroupId=com.rutake.sample -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.3</version> <scope>provided</scope> </dependency>
mvn compile
バージョンの指定はプロパティで行う。
maven.compiler.source, maven.compiler.target
mvn test
mvn test -Dtest={テストクラス名}
mvn package
mvn install
どのコマンドも初回実行時には関連jarをごっそりダウンロードするので時間はかかる。二回目以降は早い。
mvn deploy
mvn deploy:deploy-file -Durl=<アップロード先URL> -DrepositoryId=<リポジトリのID> -Dfile=<Jarファイルへのパス> -DgroupId=<グループID> -DartifactId=<アーティファクトID> -Dversion=<バージョン> -Dpackaging=jar
mvn deploy:deploy-file -Dfile=<POMFILE> -Durl=<リポジトリURL> -DrepositoryId=<リポジトリのID> -DgroupId=<グループID> -DartifactId=<アーティファクトID> -Dversion=<バージョン> -Dpackaging=pom -DgeneratePom=false
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
mvn eclipse:eclipse
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
テストをスキップする | 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ファイルを消すともう一度リモートリポジトリにアクセスしに行く |
artifact-versionno.pom.lastUpdated
http://binary-repositories-comparison.github.io/
用語名 | 説明 | 備考 |
artifactId | 成果物のこと | 人工物の意味から来ているらしい |
groupId | パッケージ階層とほぼ同じ | |
プロジェクトサイト | mavenにて自動生成できるHTMLページ | JavaDocやテストカバレッジ |
Apache archiva | 複数のmavenリポジトリをまとめるProxy的役割を果たす |
nexus | archivaと同じく、複数のmavenリポジトリをまとめるProxy的役割を果たす |
Archiva,sonatype nexus,Artifactoryがある。比較表がある。
http://docs.codehaus.org/display/MAVENUSER/Maven+Repository+Manager+Feature+Matrix
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 | リポジトリ情報 |
本体だけで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を正しく設定しないと出てしまう。