きっかけ
なんとなく知っているけど、なんとなくで終わっていることに違和感を感じたから。
参考に、下記の本をベースに学習した。
Javaビルドツール入門 Maven/Gradle/SBT/Bazel対応
- 作者: 掌田津耶乃
- 出版社/メーカー: 秀和システム
- 発売日: 2017/02/08
- メディア: 単行本
- この商品を含むブログを見る
Maven特徴
- XMLでビルドファイルを記述
- ゴールによる目的設定
命令の記述を全て書く必要はなく、作業に必要な情報を渡せば勝手にやってくれる - ライブラリ管理とセントラルリポジトリ
- テスト、ドキュメントの生成
JUnitの実行やJavadocの生成など、開発に付随する機能を行える。
Mavenの構成
説明 | |
---|---|
binフォルダ | 実行するコマンドのプログラム置き場 |
bootフォルダ | クラスローダプログラムが配置されている |
conf | 設定情報ファイルの置き場 |
lib | ライブラリ置き場 |
ファイルは、特に必要ないので割愛。
今回試した環境
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00) Maven home: E:\dev\apache-maven-3.3.9 Java version: 9, vendor: Oracle Corporation Java home: C:\Program Files\Java\jdk-9 Default locale: ja_JP, platform encoding: MS932 OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
↑の通りなので、パスは適時読み替えて。
Mavenを動かして覚える
Mavenプロジェクト作成
Mavenのプロジェクトを作成する。
プロジェクト作成は、下記のコマンドで実行する。
mvn archetype:genarate
そうすると、Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains):
みたいなことを聞かれてくる。
テンプレートとしてどれを使うか聞かれている。特に強い意志がなければ、そのままEnter。
今度は、Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
って聞かれる。
おそらく、下に下記のようなバージョンのリストが出て来るので、使いたいバージョンを指定する。
1: 1.0-alpha-1 2: 1.0-alpha-2 3: 1.0-alpha-3 4: 1.0-alpha-4 5: 1.0 6: 1.1
デフォルトは、最新バージョンが指定されているので、強い意志がなければ、そのままEnterでOK。
その後も色々聞かれる。面倒くさいので、まとめて説明。
Define value for property 'groupId': Define value for property 'artifactId': Define value for property 'version' 1.0-SNAPSHOT: : Define value for property 'package' : :
groupId、artifactIdは、任意。versionは、デフォルトで1.0-SNAPSHOT
が設定されている。特に意志がなければ、そのままでOK。
packageは、groupIdに指定したヤツがデフォルト設定される。管理的には、同じものを設定するのが定石みたいなので、強い意志がなければ、デフォルト設定でOK。
※なんか、流されてばっか。。。
※最初のうちは、デフォルト設定に任せた方が安心なのは分かるが、心の反逆心が許さない感じ。厨二くせぇな。。。
Mavenプロジェクトのフォルダ構成
artifactIdで指定した名称のフォルダの中身には、src
フォルダとpom.xml
があるはず。
それぞれの内容は、以下の通り。
srcフォルダ
ソースコード全般がまとめられる場所 中身は、下記の2フォルダ。
main, testフォルダの両方共、配下にJavaフォルダがあり、その中にJavaのソースコードやパッケージのフォルダを作成する。
イメージ的には下記
└─src ├─main │ └─java └─test └─java
デフォルトでは、mainフォルダ配下を潜っていくと、App.javaが生成されているはず。
ただのサンプルファイルなので、不要なら削除してしまっても問題なし。
今回は、このファイルを使っていろいろ試す。
pom.xml
pom.xmlの基本を覚える
<project>と基本属性
使用するMavenのバージョン。
Mavenには後方互換があるはずはので、新しいバージョンが出た場合、ココを変えるだけで基本はOKなハズ。
groupId
作成するプログラムが、どこに所属するのかを宣言する。
イメージ的には、Javaのパッケージ名に近い。
Webだとドメインに近いもの。
ここらへんの感覚は、Strutsやっていればなんとなく分かるはず。
artifactId
プロジェクトに割り当てるID。
同じグループで、別プロジェクトとして識別するために利用する。
version
プログラムのバージョンを指定する。
packaging
パッケージ化する際の種類を指定する。
通常は、jar
だが、zip
の指定も可能。
name
アプリケーション名。
重複してもOKだが、慣例的にアーティファクトIDが指定されることが多い。
url
プロジェクトのWebサイトURL。
デフォルトは、MavenサイトのURLが指定されている。
properties
pom.xmlで利用される属性値を用意するためのもの。
ビルドで何か定数が必要であれば、ここに定義する。
dependenciesと依存関係
dependencies
では、ライブラリ管理と依存性の定義を記述する。
初期状態では、JUnitが
dependencyの内容
- groupId
利用したいライブラリのグループIDを指定する。必須 - artifactId
利用したいライブラリのアーティファクトIDを指定する。必須* - version
利用するライブラリのバージョン。省略すると最新バージョンが適用される。 - scope
ライブラリの適用範囲。
compile/provided/runtime/test/systemが指定できる。
デフォルトでは、compile。
scopeの指定内容
compile | scope の指定を省略した場合のデフォルト値。全ての状況でクラスパスに追加される。 |
provided | ライブラリが JDK やコンテナによって提供される場合に指定します。コンパイル時のみクラスパスに追加されます。 |
runtime | 実行時のみに必要な場合に指定。テスト実行、通常の実行のときにクラスパスに追加される。 |
test | テストのときのみ必要な場合に指定。テストのコンパイルと実行のときにクラスパスに追加される。 |
system | 明示的にクラスパスに追加する場合に指定。このスコープのライブラリは常に有効であるとみなされ、リポジトリの検索は行われない。 |
コンパイルしてみる
pom.xmlがあるディレクトリに移動し、mvn compile
と叩く。
[ERROR] ソース・オプション1.5は現在サポートされていません。1.6以降を使用してくださ
い。
って出るかもしれない。
出る理由は、MavenがデフォルトだとJDK 1.5 ベースでコンパイルしているからのようだ。。。
その場合、propertiesに下記の感じで記述すれば、コンパイルするバージョンを指定すれば大丈夫。
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
もちろん、コンパイルなので、文法エラーがあれば怒られる。
※IDEに頼って書かなかったので、むっちゃ怒られて泣きそうになった。。。
コンパイルに成功すると、pom.xmlがあるフォルダに、target
フォルダが作成される。
中を除くと、いくつかフォルダが作成されているはず。
test-compile
compile
以外にも、test-compile
というゴールが提供されている。
これは、ユニットテスト用にクラスをコンパイルする。
実行すると、src/test
配下に作ったJavaファイルをコンパイルする。
ユニットテストを実行する場合は、mvn test
を実行する。
パッケージ化
mvn package
を実行すれば、実行可能なjarファイルが作成される。
これを実行すると、targetファイル配下に、jarファイルが作成される。
なお、このパッケージ化する前には、テストが実行される。
その他
たまにファイルが残っていることで、動作が不正になることがある。
その場合は、mvn clean
を実行する。
そうすると、target
フォルダが削除される。
セントラルリポジトリ
一元管理されているけど、利用する側から見ると見つけにくい。
その場合は、下記のサイトを使う。
Maven応用
リポジトリの利用
セントラルになくても、ローカルリポジトリを用意することで、公開したくないライブラリもmaven管理することができる。
また、セントラルリポジトリではなく、別の公開されたサーバーで提供されているものは、リモートリポジトリとして利用することができる。
リモートリポジトリ | ネットワーク経由で利用できる公開されたリポジトリ |
ローカルリポジトリ | ローカル環境にあるリポジトリ。 |