エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Mavenまとめ

きっかけ

なんとなく知っているけど、なんとなくで終わっていることに違和感を感じたから。

参考に、下記の本をベースに学習した。

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

Mavenのビルドファイル。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フォルダが作成される。
中を除くと、いくつかフォルダが作成されているはず。

  • classes
    コンパイルされたJavaのクラスファイルが格納される。
  • maven-status
    compileで利用されるcompilerプラグインによって生成されたファイルが格納されている。

test-compile

compile以外にも、test-compileというゴールが提供されている。
これは、ユニットテスト用にクラスをコンパイルする。
実行すると、src/test配下に作ったJavaファイルをコンパイルする。
ユニットテストを実行する場合は、mvn testを実行する。

パッケージ化

mvn packageを実行すれば、実行可能なjarファイルが作成される。
これを実行すると、targetファイル配下に、jarファイルが作成される。
なお、このパッケージ化する前には、テストが実行される。

その他

たまにファイルが残っていることで、動作が不正になることがある。
その場合は、mvn cleanを実行する。
そうすると、targetフォルダが削除される。

セントラルリポジトリ

http://repo1.maven.org/

一元管理されているけど、利用する側から見ると見つけにくい。
その場合は、下記のサイトを使う。

https://search.maven.org/

Maven応用

リポジトリの利用

セントラルになくても、ローカルリポジトリを用意することで、公開したくないライブラリもmaven管理することができる。
また、セントラルリポジトリではなく、別の公開されたサーバーで提供されているものは、リモートリポジトリとして利用することができる。

リモートリポジトリ ネットワーク経由で利用できる公開されたリポジトリ
ローカルリポジトリ ローカル環境にあるリポジトリ