たなかこういちの資料室

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

scala-maven-pluginとScala IDE for Eclipseで、Scala/Java混在プロジェクトの開発を試みる

scala-maven-plugin」は、MavenScalaのビルドを行う場合のデファクト標準のMavenプラグインです。Scala/Java混在ビルドもサポートします。
 
 
Scala IDE for Eclipse」は、Scalaをサポートするプラグインが同梱されたEclipseのパッケージです。開発は(Typesafe改め)Lightbend社に支援されています。
 
 
Scala IDE for Eclipseには、「Maven Integration for Scala IDE(m2eclipse-scala)」という、scala-maven-pluginの記述が含まれる"pom.xml"を認識して、Scala/Java混在構成のMavenプロジェクトの取り込みを行えるEclipseプラグインが標準で含まれています。
 
"Using Scala IDE on Maven projects" :
 
※上記ドキュメントでは、「Maven Integration for Scala IDE(m2eclipse-scala)」を後から追加導入せよ、という説明になっていますが、Scala IDE for Eclipse 4.0以降では、初めから同梱されているようでした。
 
scala-maven-pluginやScala IDE for Eclipseを利用する限り、Scalaコンパイラーはそれぞれに同梱されているものが使用されるので、別途導入は不要です。Scalaランタイムライブラリーはscala-library.jarという.jarファイルで提供されており、Mavenプロジェクトのdependencyに記述するだけで済みます。Scalaのターゲット・バージョンは、dependencyに記述されたscala-library.jarのバージョンで判断されます。
 
scala-maven-pluginやScala IDE for Eclipseを用いることで、既存に、Maven "pom.xml"で構成管理し、それをEclipseに取り込んだり、Jenkins等でビルド→デプロイするような、Java(文化)ベースの開発・運用環境があるとき、その環境には手を入れずにScalaによる開発を漸進的に混ぜ込んでいくことができます。
 
本記事は以下の試行を説明するものです。
 
- Scala IDE for Eclipseに“Java EE開発ツール”を導入する
- 標準EclipseScalaサポートプラグインを追加導入する
- scala-maven-pluginを用いたScala/Java混在Mavenプロジェクトを作成する
- Scala/Java混在Mavenプロジェクトを、Scala IDE for Eclipseに取り込む
- Scalaコードに対するJUnitコードを書く
- ScalaServletアプリのデバッグを行う
 
作業実施日と前提環境
 
- 2016年7月30日〜8月3日実施
- Mac OS X 10.11.4
- JDK 1.8.0導入済み
- Tomcat 8.0.26導入済み
※"usr/local"下にアーカイブを展開
 
■ Scala IDE for Eclipseに“Java EE開発ツール”を導入する
 
Scala IDE for Eclipse本体の導入手順については、こちらの記事を参照してください。(※少し古いですが導入手順に変更はありません。)今回のScala/Java混在プロジェクトを試すだけであれば、Play Framework導入部分は飛ばして構いません。(※Play Framework導入は今回は試していません。)
 
 
ところで、Scala IDE for Eclipseには、“Java EE開発ツール”(※Servletアプリのデバッガーなど)が含まれていません。よって、まずは「Help > Install New Software...」メニューからそれを追加することとします。
 
1. 「Help > Installation Details」メニューで確認すると、「Eclipse Java Web Developer Tools」などが無いことが分かります。(※ちなみに、下図でフォーカスしているのは「Maven Integration for Scala IDE(m2eclipse-scala)」で、初めから同梱されていました。)

f:id:tanakakoichi9230:20160817225821p:image

2. Scala IDE for Eclipseの「Help > Install New Software...」メニューを開きます。
 
3. 「Work with」欄で、「Luna - http://download.eclipse.org/releases/luna」を選択します。
 
4. しばらく待つと、追加機能が一覧されます。そこから「Web, XML, Java EE and OSGi Enterprise Development」を選択して、「Next >」ボタンを押下します。

f:id:tanakakoichi9230:20160817225802p:image

5. 「Install Details」のページに遷移します。さらに「Next >」ボタンを押下し、以降画面の指示に従ってください。
 
6. 導入が完了したら、「Help > Installation Details」メニューより、「Eclipse Java Web Developer Tools」などが導入されたことを確認します。

f:id:tanakakoichi9230:20160817225813p:image

■ 標準EclipseScalaサポートプラグインを追加導入する
 
既に“普通”のEclipseを導入済みの場合は、前節とは逆に、既存のEclipseに対してScalaサポートのプラグインだけを追加導入することもできます。
 
"Update site installation" :
 
「Help > Install New Software...」メニューでダイアログを開きます。「Work with」欄に下記URLを入力して、Enterキーを押下してください。
 
 
※一度入力したことがあれば、以後はプルダウンの選択肢から選択できます。
 
複数の機能が一覧されますが、全て選択しておきましょう。「Next >」ボタンを押下して、以降画面の指示に従って進めてください。
 
Eclipse再起動後、「Run Scala Setup Diagnostics?」というメッセージダイアログが出て、設定変更するよう促されるかもしれません。メッセージダイアログでは「Yes」押下で進んで、次のダイアログで「Use recommended default settings」を選んでおきましょう。

f:id:tanakakoichi9230:20160817225849p:image

 
続いて、「Maven Integration for Scala IDE(m2eclipse-scala)」プラグインも追加導入します。
 
"Install m2eclipse-scala" :
 
「Help > Install New Software...」メニューより、「Work with」欄に下記URLを入力して、Enterキーを押下してください。
 
 
こちらも複数の選択肢が一覧されますが、全て入れておきましょう。
 
 
なお、本記事で「Scala IDE for Eclipse」について言及している場合、本節のように既存のEclipseScalaサポートプラグインなどを追加導入したものも対象に含まれます。
 
■ scala-maven-pluginを用いたScala/Java混在Mavenプロジェクトを作成する
 
scala-maven-pluginの目的は、Scalaコードのコンパイル手順をMavenライフサイクルに導入することです。pom.xmlの<plugin>にscala-maven-pluginについての記述を追加すれば適用されます。
 
以下のようなサンプルプロジェクトを用意しました。pom.xmlを確認してみてください。
 
 
※基本的に下記scala-maven-pluginのドキュメントの説明に準じて作成しました。
 
"Mixed Java/Scala Projects" :
 
※サンプルのpom.xmlには、Scala/Java混在構成とは直接関係のない以下の事柄も盛り込まれています。これらについてはこちらの記事を参照してください。
 
・Multi-Module構成
・Multi-Profile構成
・全く私的な好みとして、"src"ではなく"source"サブディレクトリとする
 
「mvn package」してみたところ、このサンプルプロジェクトのようにJava/Scalaのコードが相互に循環参照し合っていても問題なくビルドできました。
 
※循環参照の様子の詳細はソースコードを確認してください。
 
■ Scala/Java混在Mavenプロジェクトを、Scala IDE for Eclipseに取り込む
 
前節のサンプルMavenプロジェクトをScala IDE for Eclipseに取り込むことを試しました。取り込みの手順はこちらの記事の説明に則っています。
 
結果、問題なく取り込みができました。
 
IDE上でScala/Javaいずれのソースの編集を行っても、リアルタイム・コンパイルチェックが概ね機能しました。“概ね”というのは、Scala側/Java側ソース変更がJava側/Scala側に認識されないような事が時々発生しました。(※発生条件は特定できていません。)そのときはプロジェクトのcleanで解消されました
 
■ Scalaコードに対するJUnitコードを書く
 
Scalaコード/Javaコードに対するJUnit 4テストを、Scalaで書くこともJavaで書くこともできます。Scalaで書く場合、Scalaシンタックスで記述する事以外、Javaで書く場合と全く同じように書く事ができます。Scalaコードに対するテストをJavaで書くこともできます。(※ただし、ScalaコードがJava側からどのようなAPIとしてアクセスできるかについて、いくつかのコンベンションを理解しておく必要があります。)
 
Scala IDE for Eclipseにおいて、Scalaで記述されたテストコードをlaunchするには、コンテキストメニューの「Run/Debug As > Scala JUnit Test」で行います。(※Javaで記述されたテストコードをlaunchするには、従来通り「Run/Debug As > JUnit Test」です。)
 
「mvn test」コマンドでは、Scalaで記述されたテストもJavaで記述されたテストも同時に実施され、結果はまとめて報告されます。
 
サンプルプロジェクトには、Scalaで記述したテストコードとJavaで記述したテストコードも含めていますので、試してみてください。
 
 
 
■ ScalaServletアプリのデバッグを行う
 
サンプルプロジェクトは、javax.servlet.http.HttpServletを継承したMyScalaServletというScalaクラスを含んでいて、それによるWebアプリケーションとして仕立ててあります。Mavenプロジェクトの<packaging>は"war"です。これを、“Java EE開発ツール”を追加導入したScala IDE for Eclipseデバッグ実行できるか確認しました。
 
具体的には、まず、こちらの記事の後半の説明に従って「Server」の構成をして実行、次に、Javaクラス/Scalaクラス内にブレークポイントを置いて、それぞれの個所で変数ウォッチできるか確認しました。
 
しかし、「Problems」に「Classpath entry org.scala-ide.sdt.launching.SCALA_CONTAINER will not be exported or published. Runtime ClassNotFoundExceptions may result.」というWarningが残り、Serverを起動すると、ClassNotFoundExceptionになってしまいました。明らかにScalaのランタイムライブラリーが見えていません。

f:id:tanakakoichi9230:20160817225838p:image

試行錯誤の結果、こちらの記事の後半の基本の手順に加えて、「Deployment Assembly」に「Scala Library container」を追加することで、問題は解消しました。
 
1. プロジェクトのコンテキストメニューより「Properties」のダイアログを開きます。
2. 「Deployment Assembly」を選択します。
3. 「Add...」ボタンを押下します。
4. 「Java Build Path Entries」を選択して、「Next >」を押下します。
5. 「Scala Library container [ 2.xx.xx ]」を選択して、「Finish」を押下します。
6. 「Apply」または「OK」を押下します。

f:id:tanakakoichi9230:20160817225827p:image

「Deployment Assembly」に「Scala Library container」を追加することで、「Problems」に一つ出ていたWarningも消えました。
 
ブレークポイントも変数ウォッチも、期待通りに動作しました。
 
◆以上