mevenのマルチプロジェクト構成時のビルドと実行の方法
STS(eclipse)からmavenビルドでjarファイルを作ろうとしたらエラーになった話でちょっと話に出たビルド時のゴールの設定について、マルチプロジェクト構成とともに説明する。
そもそもマルチプロジェクト構成とは何か
図を作ってみた。
マルチプロジェクトは個別に作成された子プロジェクト(childプロジェクト)と、それらをまとめている親プロジェクト(parentプロジェクト)でできている。
parent.project…pom.xmlのみで構成されているプロジェクト。pom.xmlの中には子としてプロジェクトを設定している記述がある。
child.project…それぞれのプロジェクトの目的で中身が違う。例えば今回の例で行くと、child_001.projectにはアプリケーション(javaクラスファイルとか)で構成されていて、child_002.projectは実行に必要な環境設定ファイル(propatiesファイルやxmlファイル等)で構成されている。
また、子同士で依存関係が設定されている。
child_001にchild_002の依存関係を設定していることで、child_001プロジェクトはchild_002.jarを読み込んで動作するようになっている。
この利点は、異なる環境下でアプリケーションを起動させたいときに、アプリケーション自体を修正することなく環境設定ファイルのみの修正で実行できるということが挙げられる。
(ステージング環境の考え方)
どうやって動かすの
それぞれの子プロジェクトごとにjarファイルを作成し、javaコマンドでjarファイルを指定して起動する。
jarファイルを作るためにmavenビルドを行う。(ここから本題
ビルド方法
プロジェクト右クリック→「実行」→「maven ビルド…」で「構成の編集」を開き、
ゴールに
clean dependency:copy-dependencies -DoutputDirectory=lib package
を指定する。
(こうすることでアプリのjar以外に、依存するjarファイルもtargetディレクトリの中に一式作成される)
ここで注意点。
マルチプロジェクト構成時、子同士で依存関係がある時は親からコンパイルする必要がある。
どういうことかというと、これまた図にしてみた。
この図は、各プロジェクトごとでビルドを行なった時にビルドが成功するか失敗するかを出してみたものだ。
子を見ていくと、child_003.projectとchild_002.projectはビルドに成功する。
何故ならこれらは独立したプロジェクトであり、他の子プロジェクトとの依存関係がないからである。
一方で、child_001.projectはビルドに失敗する。
これは、child_001.projectはchild_002.jarファイルを依存関係によって必要としており、child_001.projectのみのビルドする時点ではjarが見つからないからだ。
ビルドのエラーは以下のようになる。
[INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Blank Project 1.0.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] Downloading: http://repo.hoge.org/nexus/content/repositories/batch-snapshots/batch/batch-env/1.0-SNAPSHOT/maven-metadata.xml [INFO] Downloading: http://repo.hoge.org/nexus/content/repositories/batch-snapshots/batch/batch-env/1.0-SNAPSHOT/batch-env-1.0-SNAPSHOT.pom [WARNING] The POM for batch:batch-env:jar:1.0-SNAPSHOT is missing, no dependency information available [INFO] Downloading: http://repo.hoge.org/nexus/content/repositories/batch-snapshots/batch/batch-env/1.0-SNAPSHOT/batch-env-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.110 s [INFO] Finished at: 2018-01-25T11:35:59+09:00 [INFO] Final Memory: 10M/25M [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal on project batch-app: Could not resolve dependencies for project batch:batch-app:jar:1.0.0-SNAPSHOT: Could not find artifact batch:batch-env:jar:1.0-SNAPSHOT in batch-snapshots (http://repo.hoge.org/nexus/content/repositories/batch-snapshots/) -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
親からビルドを行うことで、紐づけられている子プロジェクト同士は依存関係を認識することができまとめてjarファイルを作成することができる。
ちなみにjenkins等でテストを行う場合も、親プロジェクトに対してmavenコマンドでビルドを行うこと。
アプリケーションの起動方法
コマンドプロンプトからjavaコマンドを叩く。
例として、カレントディレクトリが「c:\project\hoge」だとして、その配下に「\app」「\env」ディレクトリがありjarファイルが格納されている場合は以下のようにコマンドを叩く。
※org.hoge.batch.startBatchクラスにmainメソッドがあるとする。
java -cp "app/*;env/*;" org.hoge.batch.startBatch