たなかこういちの資料室

システム開発に携わる筆者があれこれ試したことや学んだことについてのまとめ

Multi-Module構成のMavenプロジェクトをEclipseに取り込む手順

■ はじめに
 
本記事では、Multi-Module構成のMavenプロジェクトを、Eclipseに取り込んで、デバッグ環境を構成するまでの手順を説明します。
 
手順の説明で用いるサンプルプロジェクトの"pom.xml"は、Multi-Moduleであること以外に、Multi-Profileに構成されています。デフォルトでアクティブになるprofileでのみMulti-Moduleとなり、それ以外のprofileではMulti-Moduleとならないように構成されています。本記事における試行は、このような変則的な構成の"pom.xml"によるMavenプロジェクトでも、Eclipseに取り込みできることを実証する目的も担っています。下記記事で、何故Multi-Module構成かつMulti-ProfileなMavenプロジェクトを扱いたいかの背景理由、およびそれを実現するための"pom.xml"の記述の要点について説明していますので、合わせてご参照ください。
 
 
サンプルプロジェクト
 
本記事では、以下のサンプルプロジェクトを用いて説明します。
 
 
※これらのサンプルプロジェクトの利用、改変、再配布などは一切自由です。
 
"my-multi-module-web-app"と"my-multi-module-java-app"は、"my-multi-module-parent"が含む親たるsuper pomの元でMulti-Moduleに構成されています。また、"my-multi-module-parent"のsuper pomは、Multi-Profileに構成されていて、Multi-Module構成が有効になるのはデフォルトでアクティブになるprofileでのみ、となっています。
 
前提環境
 
本記事の説明は下記環境で動作確認しています。
 
- Mac OS X 10.10.5
- JDK 1.8.0
- Maven 3.3.3
- Eclipse LUNA
- Tomcat 8.0.26
 
JDKは7でも動作するはずです。サンプルプロジェクトはServlet仕様3.1前提で作成しているので、Tomcat 8以降でないと動作しないと思われます。とはいえ、単に"web.xml"のネームスペースやスキーマ定義だけの問題なので、適宜書き換えればよいはずです。
 
<参考>
Apache Tomcat、"Which Version Do I Want?":
 
試行実施時期
 
本記事の内容を確立するために各種試行を行った時期は、2015年11月〜12月です。
 
要点まとめ
 
本記事の示す手順の要点を最初にまとめます。
 
(1) Eclipseの「File > Import...」メニューより、「Maven / Existing Maven Projects」を選択してMavenプロジェクトを取り込みます。super pomを含むMulti-Moduleの親プロジェクトを選択すると、関連する子プロジェクトを一括で取り込みできます。
 
(2) Mavenプロジェクト取り込み後、Tomcatなどの「Server」を構成する必要があります。このとき、「Debug As > Debug Configurations...」または「Run As > Run Configurations...」コンテキストメニューより、次の設定を行うことが重要です。
 
Apache Tomcat / Tomcat v8.0 Server at localhost」など構成対象の「Server」について、「Classpath」タブの「Users Entries」に、取り込んだプロジェクトを全て追加する。
 
(3) 開発チームの他のメンバーなどによって"pom.xml"が更新された場合には、「Maven > Update Project...」コンテキストメニューより、Mavenプロジェクトの更新取り込みを行うことができます。
 
詳細
 
以降、手順の詳細をサンプルプロジェクトを用いながら説明します。
 
本記事の説明する手順は、大きく、Mavenプロジェクトを単純にEclipseに取り込むまでの段階と、取り込んだ後にデバッグ環境の構成を行う段階とに分けれます。次の最初の節では、Eclipseに単純に取り込むまでの段階を説明します。
 
1.MavenプロジェクトをEclipseに取り込む
 
基本方針として、Maven側の「mvn eclipse:eclipse」コマンドで".project"や".classpath"を生成する方法ではなく、Eclipse側のMavenプロジェクト取り込み機能を使用します。
 
※ちなみに、maven-eclipse-pluginは、2015年10月7日付で"retired"になってしまっています。
 
Apache Maven Project、"Available Plugins - Retired":
 
1-1. サンプルプロジェクトを“Workspace”に配置します。
 
super pomのプロジェクトである"my-multi-module-parent"を含む三つのプロジェクトを、EclipseのWorkspaceとするディレクトリ下にならべて配置します。

f:id:tanakakoichi9230:20160817003535p:image

上図は、"~/Projects/Templates/MultiModule"ディレクトリ下に、三つのプロジェクトを配置した様子となります。各プロジェクトは、それぞれのリポジトリーからGit Cloneしています。
 
※ちなみにこの画面は「Path Finder」という高機能ファイラーによるものです。好んで使っています。
 
"Path Finder 7 by Cocoatech":http://www.cocoatech.com/pathfinder/
 
1-2. 上記"~/Projects/Templates/MultiModule"ディレクトリをWorkspaceに指定しつつ、Eclipseを起動します。

f:id:tanakakoichi9230:20160817003528p:image

1-3. Eclipseが起動したら、一旦、参照JDKJavaコンパイラーのバージョン設定を確認します。
 
Eclipseの「環境設定...」(または「Preferences...」)メニューを選択し、「Installed JREs」と「Compiler compliance level」を確認してください。「MavenプロジェクトをEclipseに取り込む」という観点では、いずれのバージョンでも構いませんが、実際のプロジェクトにおいては、これらの設定が確かに目的のJavaバージョンとなっているか、最初に確認しておいた方がよいです。なお、本記事のサンプルプロジェクトは「8」でのみ動作確認しています。

f:id:tanakakoichi9230:20160817003549p:image

f:id:tanakakoichi9230:20160817003543p:image

1-4. Javaバージョンの設定が完了したら、「File > Import...」メニューを選択します。
 
1-5. 開いたダイアログにて、「Maven / Existing Maven Projects」を選択して、「Next >」を押下します。

f:id:tanakakoichi9230:20160817003521p:image

1-6. 次の画面では、「Browse...」ボタンを押下して、super pomのプロジェクトである"my-multi-module-parent"を選択します。

f:id:tanakakoichi9230:20160817003555p:image

すると、上図のように、関連する子プロジェクトまとめて取り込み準備されます。
 
1-7. 「Finish」を押下してMavenプロジェクトのimportを実行します。
 
Eclipseの「Package Explorer」の画面は、三つのプロジェクトが取り込まれた状態となります。このときWorkspaceとした"~/Projects/Templates/MultiModule"ディレクトリを確認すると、Eclipse Workspaceの情報が保存される".metadata"、および各プロジェクト毎に".project"、".classpath"、".settings"が生成されている様子がわかります。

f:id:tanakakoichi9230:20160817003627p:image

2.「Server」を構成する
 
引き続いて、Tomcatを用いたデバッグ環境の構成を行います。
 
2-1. 「File > New > Other...」メニューを選択します。開いたダイアログで「Server / Server」を選択し、「Next >」を押下します。

f:id:tanakakoichi9230:20160817003634p:image

2-2. 次の画面で「Apache / Tomcat v8.0 Server」を選択します。

f:id:tanakakoichi9230:20160817003640p:image

サンプルプロジェクトはServlet仕様3.1前提で作成しているのでTomcat 8以降でないと動作しないと思われます。実際のプロジェクトでは適宜目的のServerを選択してください。
 
2-3. 「Next >」を押下して次の画面に進みます。「Browse...」ボタンを押下して、Tomcat 8の導入先パスを指定します。そして「Next >」ボタンを押下してください。「Finish」ボタンは押下しないでください。(※「Finish」を押下してしまった場合は「2-4.」は飛ばしてください。「2-8.」でリカバリーします。)

f:id:tanakakoichi9230:20160817003645p:image

ここでは、"usr/local"下に配置したTomcatを選択しています。(※Tomcatは事前に導入しておいてください。)
 
2-4. 「Next >」を押下した次の画面では、左の「Available」ペインに表示される"my-multi-module-web-app"を選択し、「Add >」ボタンを押下して、右の「Configured」ペインに移してください。

f:id:tanakakoichi9230:20160817003650p:image

2-5. 「Finish」を押下します。ダイアログが閉じて、「Package Explorer」に「Servers / Tomcat v8.0 Server at localhost-config」のノードが出現しているのを確認してください。

f:id:tanakakoichi9230:20160817003655p:image

※上図では、ウィンドウキャプションが「Scala IDE」などとなってますが、実体としてEclipse LUNAと同じです。Typesafe社から、EclipseScala開発用プラグインをパッケージにしたものが「Scala IDE」としてリリースされています。
 
2-6. 「Window > Show View > Other...」メニューを選択します。開いた「Show View」ダイアログ内の一覧から、「Server / Servers」を選択して、「OK」を押下します。
 
2-7. 「Servers」のタブが表示されることを確認します。

f:id:tanakakoichi9230:20160817003738p:image

2-8. もし、「2-3.」で「Finish」を押下してしまっていた場合は、「Servers」タブ内の「Tomcat v8.0 Server at localhost」を選択して、「Add and Remove...」コンテキストメニューを選びます。すると、「2-4.」同様のダイアログが開きますので、「2-4.」同様の操作をしてください。
 

f:id:tanakakoichi9230:20160817003702p:image

 
2-9. ここで一旦動作確認をします。"my-multi-module-web-app"のプロジェクトを選択して、「Debug As > Debug on Server」コンテキストメニューを選択します。(※「Run As > Run on Server」コンテキストメニューでも構いません。)
 

f:id:tanakakoichi9230:20160817003711p:image

 
2-10. 下図のようなダイアログが開きます。お好みで「Always use this server when running this project」のチェックをONにしてください。「Finish」ボタンを押下してください。

f:id:tanakakoichi9230:20160817003722p:image

2-11. ダイアログが閉じて、Tomcatが起動し、「Internal Web Browser」が開きます。
 
ここで下記2点を確認してください。
 
(1) 「Console」のログに、エラーがでていない。
(2) 「Internal Web Browser」の画面に、下図のように「This is index.jsp」と表示されている。

f:id:tanakakoichi9230:20160817003729p:image

2-12. もう一点動作確認をします。Internal Web Browserのアドレス欄のURLの末尾に"hello"を付け加えて、Enterを押下します。
 
ここで下記の点を確認してください。
 
・「java.lang.NoClassDefFoundError: example/Sub」のエラーとなっていること。

f:id:tanakakoichi9230:20160817003831p:image

2-13. 前項のエラーが解消されるように設定変更します。"my-multi-module-web-app"のプロジェクトを選択して、「Debug As > Debug Configurations...」コンテキストメニューを選択します。(※「Run As > Run Configurations...」コンテキストメニューでも構いません。)
 
2-14. 開いたダイアログにて、左ペインより「Apache Tomcat / Tomcat v8.0 Server at localhost」を選択します。さらに「Classpath」タブを選択します。

f:id:tanakakoichi9230:20160817003602p:image

2-15. 「Classpath」タブの画面で、「Users Entries」の行をクリックします。するとボタンがenableになるので、「Add Projects...」ボタンを押下します。

f:id:tanakakoichi9230:20160817003611p:image

2-16. 「Project Selection」ダイアログが開いて、"my-multi-module-java-app"と"my-multi-module-web-app"がリストされるはずです。「Select All」ボタン押下し、さらに「OK」を押下します。
 
2-17. 「Classpath」タブの画面に戻ると、「User Entries」下に"my-multi-module-java-app"と"my-multi-module-web-app"が追加されているのを確認してください。

f:id:tanakakoichi9230:20160817003619p:image

2-18. 「Apply」ボタン、続いて「Close」ボタンを押下します。
 
2-19. Tomcatを再起動して、Classpathの変更を反映します。「Servers」のタブを開いて、“赤四角のボタン”を押下してTomcatを停止します。引き続いて“虫のボタン”または“右三角ボタン”を押下してTomcatを再始動します。

f:id:tanakakoichi9230:20160817003842p:image

2-20. Internal Web Browserのアドレス欄に、再び下記URLを入力してEnterを押下します。「Hello Web!」と表示されれたら成功です!
 

f:id:tanakakoichi9230:20160817003851p:image

3.pom.xmlが更新された場合の更新取り込みをしてみる
 
本節では、他のメンバーによってpom.xmlが更新されたような場合に、それをEclipseの環境へ更新取り込みする手順の説明を行います。
 
ここではpom.xmlの<dependency>が変更されたとして、それを更新取り込みしてみます。
 
 
まず、<dependency>の変更が確かにEclipseデバッグ環境に反映することを確認するための準備をします。
 
"my-multi-module-java-app"プロジェクト内の、"Sub.java"を開きます。

f:id:tanakakoichi9230:20160817003900p:image

下図の様に、Guavaを参照するようなコードに修正します。当然コンパイルエラーとなります。

f:id:tanakakoichi9230:20160817003909p:image

この状態のままInternal Browserでリクエストしても、もちろんエラーとなります。

f:id:tanakakoichi9230:20160817003918p:image

以上で準備完了です。この状態で、Guavaの<dependency>が追加されたpom.xmlを更新取り込みすると、コンパイルエラーが無くなり、実行できるようになることを確認してみます。
 
◆注意◆
ここまでの作業は、pom.xmlの<dependency>変更が確かにEclipseデバッグ環境に反映することを確認するための手立てを準備しただけです。Mavenプロジェクトの更新取り込みの手順そのものとは関係ありません。
 
 
3-1. SCMより最新のpom.xmlを取得します。
 
実際にはGit PullやSvn Updateするところですが、ここでは外部テキストエディターでpom.xmlを編集して、pom.xmlの更新をエミュレートします。
 
"my-multi-module-parent"のpom.xmlを、Eclipse以外のエディターで開きます。(※Eclipseのエディターで編集してしまっては、Eclipseの外部でファイルの更新が発生したことをエミュレートできないので、必ず他のエディターで編集します。)最後の方にGuavaの<dependency>がコメントアウトされた状態で記述されているので、コメントを外してGuavaの<dependency>を有効にしてください。

f:id:tanakakoichi9230:20160817003744p:image

上図は、コメントを外してGuavaの<dependency>を有効化した状態です。
 
3-2. Eclipseに戻り、「Package Explorer」内の"my-multi-module-parent"を選択して、「Maven > Update Project...」コンテキストメニューを開きます。
 

f:id:tanakakoichi9230:20160817003751p:image

 
3−3. 開いたダイアログで、更新対象プロジェクトを選択します。ここでは"my-multi-module-parent"だけでよいです。

f:id:tanakakoichi9230:20160817003801p:image

3-4. 「OK」を押下してダイアログを閉じます。下記の点を確認してください。
 
(1) リビルドが走り、"Sub.java"のコンパイルエラーが解消すること。
(2) Tomcat Serverが起動中だった場合、「コンテキストの再ロード」が発生すること。

f:id:tanakakoichi9230:20160817003808p:image

3-5. 最後に、Internal Web Browserで下記URLを再度リクエストしてください。「Gooooood Morning Web!」と表示されていれば更新成功です。
 

f:id:tanakakoichi9230:20160817003818p:image

◆以上