Maven基礎
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Maven基礎

  • 6,972 views
Uploaded on

何年か前に社内向けMaven勉強会で発表した資料。 ...

何年か前に社内向けMaven勉強会で発表した資料。
Maven使ったことない、使ってるけど仕組みは知らないという人向けに。

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,972
On Slideshare
6,942
From Embeds
30
Number of Embeds
4

Actions

Shares
Downloads
50
Comments
0
Likes
27

Embeds 30

http://fission.dip.jp 19
https://twitter.com 7
http://s.deeeki.com 3
http://192.168.33.10 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Maven基礎 2013/9/30 株式会社アークシステム 瀧口 季男
  • 2. Mavenって? Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. http://maven.apache.org 上に書いてある通り、ソフトウェアプロジェ クトの管理&支援ツールです。
  • 3. Javaでコンパイル ~どうやるんだっけ?~
  • 4. javacって、ありましたよね? コンパイル? javac -cp lib/foo.jar;lib/baa.jar;lib/poo.jar -source 1.5 -target 1.5 -d classes src/com/example/foo/*.java src/com/example/baa/*.java JAR? jar cvf hoge.jar -C classes/ . 実行? java –cp classes;lib/foo.jar;lib/baa.jar;lib/poo.jar com.example.foo.Main arg… 私には無理です。本当にありがとうございました。
  • 5. Ant ~それは革命~
  • 6. さよならシェルスクリプト build.xmlを書いておけば、ant compile でコンパイルできる! <project name="hoge" default="jar" basedir="."> <target name="compile"> <javac destdir="bin" encoding="UTF-8"> <src path="src" /> <classpath> <fileset dir="lib"> <include name="**/*.jar" /> </fileset> </classpath> </javac> </target> <target name="jar" depends="compile"> <jar jarfile="dist/hoge.jar" basedir="bin"></jar> </target> </project>
  • 7. Antがあってよかったなって Write once, build anywhere! ビルドに必要なソース、依存JAR、 build.xmlとAntが一式あれば、Windowsで もLinuxでもビルドできる!
  • 8. パーキンソンの法則 仕事は、その遂行のために利 用できる時間をすべて埋める ように拡大する
  • 9. Antあるある オレオレbuild.xml 「私のプロジェクトでは、モジュール名をソー スディレクトリ名とする キリッ」 依存JARが増えると・・・ いちいちサイト巡ってダウンロードするのめん どくせ (‘A`) SCMにJARを全部コミットしたらサーバーのHDD が・・・ あれ、デジャビュ? このAnt task、夢の中で書いた、ような・・・ いちいちbuild.xml書くのめんどくせ (‘A`)
  • 10. ヒックの法則 意思決定にかかる時間は、可 能な選択肢の数に依存する
  • 11. じゃ、決めちゃおうぜ プロジェクトのディレクトリ構成 決めても従わない奴ばかりだとしても、もし最初 からディレクトリ構成を作ってくれるとした ら? 依存jarの解決 あちこち探してダウンロードするんじゃなくて、 1箇所に集まってたら?さらに、自動でダウン ロードしてくれるとしたら? ビルドの流れ コンパイルして、テストして、ZIPで固めて・・
  • 12. __ __ | ¥/ |__ _Apache__ ___ | |¥/| / _` ¥ V / -_) ' ¥ ~ intelligent projects ~ |_| |_¥__,_|¥_/¥___|_||_| v. 1.0.2 ~ビルドツールのその先へ~
  • 13. ディレクトリ構成決めました これで行くから。 [basedir] ├ pom.xml ├ src │ ├ main │ │ ├ java │ │ └ resources │ └ test │ ├ java │ └ resources └ target ├ classes └ test-classes src/main/webapp、src/siteなどもある maven 1.0 の頃は、mainとtestが分かれてなかっ た。時代の流れを感じるところ。 http://maven.apache.org/guides/introduction/introductio n-to-the-standard-directory-layout.html
  • 14. JARのリポジトリ作りました セントラルリポジトリにたくさんのJARを集めて公 開するよ 個々のJARを識別する仕組みも考えたよ groupId、artifactId、versionで特定するよ 依存するJARを設定ファイルに書いて明確化できるよ ビルド時に自動で依存を解決するよ リポジトリからJARをダウンロードするよ ダウンロードしたJARがSCM管理下に入らないように、 こっそり別の場所に保存しておくよ http://maven.apache.org/guides/introduction/introductio n-to-repositories.html
  • 15. ビルドの流れを決めました Clean Site validate pre-clean pre-site compile Build Lifecycle Default clean site test post-clean post-site package integration -test verify install deploy site-deploy Mavenには3種類のライフサイク ルがある Defaultライフサイクルは、実際 もっと細かいフェーズに分かれ ている(全部で23個!) http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
  • 16. ここまでのまとめ javacからAnt ビルドの定型化、環境非依存化 開発が大規模化するにつれ、冗長なところ が多くなった AntからMaven ビルドの普遍化、環境の統一化
  • 17. Mavenがうごくしくみ ~Goal & Lifecycle~
  • 18. Maven本体とゴール Maven本体の機能 POM(後述)の解析 ライフサイクルの各フェーズに結びつい たゴールの実行 ゴール ビルドの個々のタスク。コンパイル、JAR 作成、ファイルのコピーなどなど。 ゴールは全てプラグインが提供する
  • 19. Goalの実行 個々のプラグイン名:ゴール名で、1 個のゴールを実行する compiler :compile > mvn compile Maven dependency resolve copy list compiler compile testCompile surefire test jar jar test-jar pluginたち
  • 20. Phaseの実行 ライフサイクル中の指定したPhaseま で、各Phaseに紐付いたゴールを実行 する 各Phaseに結びつ resolve いたGoalを実行 > mvn test dependency Maven validate compile test validate copy list compiler compile testCompile surefire test compile test package ・ ・ ・ jar jar test-jar
  • 21. 実行の仕方 mvn [options] [<goal(s)>] [<phase(s)>] Goal Mavenに実行させたいタスクの指定 [プラグイン名]:[ゴール名]で指定する mvn compiler:compile mvn jar:jar Phase ビルドライフサイクルをどのフェーズま で実行するか、という指定 各フェーズには、複数のゴールが結びつ いている
  • 22. Mavenの設定 ~POM~
  • 23. POM “Project Object Model” プロジェクト情報をXMLで記述する <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>hoge-project</artifactId> <version>1.0.0</version> <!-- その他色々な設定 --> </project> いくつか紹介しますが、詳しくはWeb で! http://maven.apache.org/pom.xml
  • 24. dependencies プロジェクト依存ライブラリの設定 <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>hoge</artifactId> <version>1.0.0</version> <scope>compile</scope> </dependency> <dependency>…</dependency> </dependencies> groupId, artifactId, version JARを一意に特定するキー scope いつ必要なのかを指定する compile (デフォルト) provided runtime test system ローカルに無ければ、自動でリポジトリからダ ウンロードされる Mavenのセントラルリポジトリ以外のリポジトリ は repositories に設定する必要あり
  • 25. build ビルドに関する設定(プラグイン等) <build> <defaultGoal>validate</defaultGoal> <resources> <resource>…</resource> </resources> <plugins> <plugin>…</plugin> </plugins> </build> defaultGoal goal/phase指定が無い場合に実行さ れるgoal/phaseを指定する resources 成果物に含める、含めないリソース (*.properties, *.xml等) を設定する plugins ビルドに使用するプラグイン設定 プラグインの追加 phaseにgoalを結びつけ プラグインの引数設定 ソースディレクトリ、ビルドしたclass ファイルの出力先を変更することもでき る でも、基本的にやらない。
  • 26. build - plugin ビルドにプラグインを追加 <plugin> <groupId /> <artifactId /> <version /> <configuration>…</configuration> <executions> <execution> <id>taskname</id> <phase>compile</phase> <goals> <goal>doTask</goal> </goals> <configuration>…</configuration> </execution> </executions> </plugin> groupId, artifactId, version プラグインを特定するキー configuration プラグインの引数設定 execution phaseにgoalを結びつける phase 紐付け先のフェーズ goal フェーズで実行するプラグインのgoal
  • 27. parent (Super POM) 親POMの設定 <parent> <groupId>com.example</groupId> <artifactId>hoge</artifactId> <version>1.0.0</version> <relativePath>…</relativePath> </parent> 依存ライブラリのバージョン、ビルド時 のプラグイン設定などを書いた親POMを 引き継ぐことができる
  • 28. build - pluginManagement プラグインの一括管理 <pluginManagement> <plugins> <plugin>…</plugin> </plugins> </pluginManagement> 親POMに書いておけば、子モジュールに 引き継がれる マルチモジュール構成で活躍
  • 29. dependencyManagement 依存ライブラリの構成管理 <dependencyManagement> <dependencies> <dependency> <groupId /> <artifactId /> <version /> <scope /> </dependency> <dependency>…</dependency> </dependencies> </dependencyManagement> dependencyと同じ JARを一意に特定するキー アーティファクトの属性 (version, scope, exclutions) を設定でき、dependenciesで個別に指 定する必要が無くなる
  • 30. profile 環境に応じて設定を切り替えるしくみ <profiles> <profile> <id>production</id> <activation>…</activation> <build>…</build> <dependencies>…</dependencies> </profile> <profile>…</profile> </profiles> activation プロファイルを有効化する条件を設定する build プロファイルごとのビルド設定 dependencies プロファイルごとの依存関係 例えば 3つのprofile (本番, 保守, 開発) を用意し、DB接続設定 ファイルを切り替える JDKのバージョンに応じたJARを生成するため、コンパ イル対象とするソースファイルを差し替える
  • 31. Mavenを使う人が知っておく べき97のこと
  • 32. M2_HOME Mavenインストールディレクトリを指 す環境変数 Mavenの実行には、%M2_HOME%の設 定と、%M2_HOME%/bin をPATHに通 す必要がある
  • 33. ローカルレポジトリ Mavenが自動でダウンロードしたJAR (依存関係、プラグイン)が格納され るディレクトリのこと [ユーザーのホームディレクトリ]/.m2
  • 34. リポジトリのミラーを設定する セントラルリポジトリにあるはずなの にJARがダウンロードできない! セントラルリポジトリが落ちてた よ・・・ そんなときは ホームディレクトリの.m2/settings.xmlで ミラーを設定する <settings> <mirrors> <mirror> <id>UK</id> <name>UK Central</name> <url>http://uk.maven.org/maven2</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings>
  • 35. リポジトリを追加する セントラルリポジトリに無いライブラ リ(Seasar、JBoss、etc…)を利用す る場合は、リポジトリの設定をPOMに 追加する <repositories> <repository> <id>maven.seasar.org</id> <name>The Seasar Foundation Maven2 Repository</name> <url>http://maven.seasar.org/maven2</url> </repository> </repositories>
  • 36. プラグインリポジトリを追加する ビルドで使用するプラグインがセント ラルリポジトリに存在しない場合は、 プラグインリポジトリの設定をPOMに 追加する <pluginRepositories> <pluginRepository> <id>maven.seasar.org</id> <name>The Seasar Foundation Maven2 Repository</name> <url>http://maven.seasar.org/maven2</url> </pluginRepository> </pluginRepositories> Maven 3 はリポジトリの解釈が厳密化され、 repositoriesからプラグインを解決しないよう になった
  • 37. 良く使うフェーズ clean targetディレクトリを削除する。ソースから一部 のファイルを削除した等の理由でフルビルドした いときに使う。 package JAR等、最終成果物を生成する。POMを書く人は、 このフェーズでリリース物が出来るように設定す るつもりで。 install 生成したJARをローカルリポジトリにコピーする。 当該プロジェクトを参照する他のプロジェクトか ら、JARを利用できるようになる。
  • 38. IDE と統合する Eclipse m2e EclipseのMaven統合プラグイン Indigo (3.7) から統合済み、Kepler (4.3) からはm2e-wtpも統合 Mavenに投資しているSonatypeが開発元 maven-eclipse-plugin POMからEclipseの.projectと.classpathを生成する、 MavenのEclipse対応プラグイン dependencyのscopeを解釈できないのでお勧めしない NetBeans 最初からMaven統合済み IntelliJ たぶんイケる(誰か買ってください
  • 39. テストをスキップする もちろんそんなこと有り得ない訳ですが。 ソースをチェックアウトしてビルドしてみたら、 テストが通らない テストが通らないのでJARができず、関連プロ ジェクトが全部ビルドできない テストが通ってなくてもいいから、とりあえず JARが欲しい そんなときは mvn install -DskipTests テストクラスのコンパイル自体できない? mvn install -Dmaven.test.skip
  • 40. 残りの9xのこと Maven2のTipsを集めるWiki http://wiki.fdiary.net/maven2/ 誰でも編集できるので、何かあったら書 きましょう