Scala IDE for Eclipseには、「Maven Integration for Scala IDE(m2eclipse-scala)」という、scala-maven-pluginの記述が含まれる"pom.xml"を認識して、Scala/Java混在構成のMavenプロジェクトの取り込みを行えるEclipseプラグインが標準で含まれています。
※上記ドキュメントでは、「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による開発を漸進的に混ぜ込んでいくことができます。
本記事は以下の試行を説明するものです。
■ 作業実施日と前提環境
- 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本体の導入手順については、こちらの記事を参照してください。(※少し古いですが導入手順に変更はありません。)今回の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)」で、初めから同梱されていました。)
3. 「Work with」欄で、「Luna - http://download.eclipse.org/releases/luna」を選択します。
4. しばらく待つと、追加機能が一覧されます。そこから「Web, XML, Java EE and OSGi Enterprise Development」を選択して、「Next >」ボタンを押下します。
5. 「Install Details」のページに遷移します。さらに「Next >」ボタンを押下し、以降画面の指示に従ってください。
"Update site installation" :
「Help > Install New Software...」メニューでダイアログを開きます。「Work with」欄に下記URLを入力して、Enterキーを押下してください。
※一度入力したことがあれば、以後はプルダウンの選択肢から選択できます。
複数の機能が一覧されますが、全て選択しておきましょう。「Next >」ボタンを押下して、以降画面の指示に従って進めてください。
Eclipse再起動後、「Run Scala Setup Diagnostics?」というメッセージダイアログが出て、設定変更するよう促されるかもしれません。メッセージダイアログでは「Yes」押下で進んで、次のダイアログで「Use recommended default settings」を選んでおきましょう。
・
"Install m2eclipse-scala" :
「Help > Install New Software...」メニューより、「Work with」欄に下記URLを入力して、Enterキーを押下してください。
こちらも複数の選択肢が一覧されますが、全て入れておきましょう。
・
scala-maven-pluginの目的は、Scalaコードのコンパイル手順をMavenライフサイクルに導入することです。pom.xmlの<plugin>にscala-maven-pluginについての記述を追加すれば適用されます。
以下のようなサンプルプロジェクトを用意しました。pom.xmlを確認してみてください。
・Multi-Module構成
・Multi-Profile構成
・全く私的な好みとして、"src"ではなく"source"サブディレクトリとする
※循環参照の様子の詳細はソースコードを確認してください。
結果、問題なく取り込みができました。
IDE上でScala/Javaいずれのソースの編集を行っても、リアルタイム・コンパイルチェックが概ね機能しました。“概ね”というのは、Scala側/Java側ソース変更がJava側/Scala側に認識されないような事が時々発生しました。(※発生条件は特定できていません。)そのときはプロジェクトのcleanで解消されました。
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」です。)
サンプルプロジェクトは、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のランタイムライブラリーが見えていません。
1. プロジェクトのコンテキストメニューより「Properties」のダイアログを開きます。
2. 「Deployment Assembly」を選択します。
3. 「Add...」ボタンを押下します。
4. 「Java Build Path Entries」を選択して、「Next >」を押下します。
5. 「Scala Library container [ 2.xx.xx ]」を選択して、「Finish」を押下します。
6. 「Apply」または「OK」を押下します。
「Deployment Assembly」に「Scala Library container」を追加することで、「Problems」に一つ出ていたWarningも消えました。
ブレークポイントも変数ウォッチも、期待通りに動作しました。
◆以上