JavaではPHPやRubyなどといったインタプリタ言語とは違い、ソースはクラスファイルといわれるファイルに変換する必要があります。この作業をコンパイルと呼びます。最低限この作業をやらないとプログラムとして機能しません。
また複雑なソースになりますと、コンパイルだけではだめで、テストをしたり、以前のファイルを削除したり、jarファイルとしてまとめたりします。このような一連の作業を行う一括で行うツールをビルドツールと呼びます。
ビルドツール
私もJavaを学習したての一番最初のころはコマンドプロンプトで作業をしていました。単純なファイルだったらこれでよいですが、実務で使われるようなファイルをこのように対応するのは無理でしょう。
これがまたかなり面倒で、なれないうちはイライラの元であり、私もJavaが嫌いになりそうでした(汗)手作業で無理、と思った方が次に考えるのはバッチやシェルスクリプトなどかと思います。
ただ自分の手で作ったものですとカスタマイズでき、柔軟性がある反面、どこかしらにエラーや漏れがあることが多いです。また似たような処理をみんなが行うことからJavaでは下記のようなビルドツールが一般的です。
Ant
古くから使われているビルドツールです。build.xmlというxmlファイルにタスクを定義しておき、コマンドラインから ant -f compile などと打って実行をします。ファイルの構成は下記のような流れです。
基本的には1つの実行単位をプロジェクトと定義し、<project>タグで囲みます。その中で実際に行う1つ1つのタスクをtargetといいます。
(下記が)イメージです。
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8" ?> <project name="sample"> <target name="task1"> </target> <target name="task2"> </target> </project> |
targetのプロパティはname(名称)だけでなく、下記のようなプロパティが追加できます。
属性 | 説明 | 必須 |
---|---|---|
name | ターゲットの名前 | 必須 |
depends | 依存しているターゲット | × |
if | ターゲットを実行するために設定されていなければならないプロパティ名 | × |
unless | ターゲットを実行するために設定されていてはならないプロパティ名 | × |
description | ターゲットの機能の簡単な説明 | × |
また1つ1つのtargetのなかには値をプロパティとして保存させたり、xml形式で実行させたいコマンドを定義できます。
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="utf-8" ?> <project name="sample" default="task1"> <target name="task1"> <echo message="Hello, world"/> </target> </project> |
このbuild.xmlをant でコマンドラインからたたくとHello,worldが表示されます。
ちなみに下記リンクを参考にしました。
http://www.javadrive.jp/ant/buildxml/index1.html
Maven
Antの機能を内包し、さらに機能が拡張されたのがmavenです。下記のような特徴があります。
- Antの機能は全て内包している
- 単なるビルドツールだけではなく、プロジェクト管理ツールでもある
- プラグインの依存管理を一元化できる
- ソース変更履歴管理などの機能を有する
mavenを使用した場合、下記のようにメインのソースコートとテストコードが分かれることが一般的です。
1 2 3 4 5 6 7 |
src/main/java Javaソース src/main/resources ソース以外のアプリケーションに必要なファイル(*.properties等) src/main/config 設定ファイルなど src/main/webapp Webアプリケーションファイル(WARプロジェクトのみ)。直下にWEB-INFがある。 src/test/java ユニットテスト src/test/resources ユニットテスト時に利用されるリソースファイル。デプロイ時には適用されない。 src/site プロジェクト用Webサイトの構築時に利用されるファイル |
pom.xmlについて
Antがbuild.xmlでビルドを定義するようにmavenではpom.xmlというファイルでタスクを定義します。
基本的にはプロジェクトの情報をXML形式でもち、以下のようなプロパティが設定されます。
- modelVersion POM のバージョン。 特に変更する必要はありません。
- groupId プロジェクトを一意に識別する名前。 プロジェクトのルートパッケージ名を指定するのが一般的です。
- artifactId プロジェクトの成果物の名前。 作成する JAR や WAR, EAR ファイルなどの名前に使用されます。
- packaging 作成する成果物のパッケージング・タイプ。 jar (デフォルト), war, ear などがあります。
- version プロジェクトのバージョン。
- name プロジェクトの表示名。 ドキュメントを作成するときなどに使用されます。
- url プロジェクトのサイトの URL。 ドキュメントを作成するときなどに使用されます。
- dependencies プロジェクトが依存するライブラリの情報。←ここに依存ライブラリを書くため、追加することが多い。dependenciesについてJunitへの依存性はディフォルトで行われる。
dependenciesの中に書かれるscopeというタグは依存するライブラリがいつクラスパスに通されるかを指定できます。
1 2 3 4 5 6 |
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> |
となっていたらtest時にクラスパスに通されます。
scope に指定できる値とその意味は以下の通りです:
- compile scope の指定を省略した場合のデフォルト値です。全ての状況でクラスパスに追加されます。
- provided ライブラリが JDK やコンテナによって提供される場合に指定します。コンパイル時のみクラスパスに追加されます。
- runtime 実行時のみに必要な場合に指定します。テストの実行および通常の実行のときにクラスパスに追加されます。
- test テストのときのみ必要な場合に指定します。テストのコンパイルと実行のときにクラスパスに追加されます。
- system 明示的にクラスパスに追加する場合に指定します。このスコープのライブラリは常に有効であるとみなされ、リポジトリの検索は行われません。
スコープに関してはくわしくはこちら
http://www.techscore.com/tech/Java/ApacheJakarta/Maven/3/
プラグインを設定したい場合はbuildタグ以降に下記のように書くことが多いです。
ちなみにpom.xmlに書かない場合はコンソールからコマンドを打ち込むときに引数を渡
します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<build> ... <plugins> ... <plugin> <groupId>プラグインの groupId</groupId> <artifactId>プラグインの artifactId</artifactId> <version>プラグインのバージョン</version> <configuration> プラグインに渡すパラメータ </configuration> </plugin> ... </plugins> ... </build> |
参考URL http://www.techscore.com/tech/Java/ApacheJakarta/Maven/2-2/
↓まとまりという点ではここが一番わかりやすいかも・・
Java製アプリを Eclipse から実行したことしかない新人に「ビルドツールとは?」を説明してみる…そして CI へ