技術的な話

Scala + sbtの開発環境をIntelliJ IDEAで構成してみる

久しぶりにScalaに触る機会があったのでIntelliJ IDEAでの環境構築にトライしてみました。

昔はEclipseでしたがPluginの消失やら、色々ありIntelliJにしました。今更感がありますが、状況が異なる点もあるので備忘録的に記載していこうと思います。

Eclipseで使用できたPluginであるScala IDEはメンテナンスはされていない上、scala-ide.orgのサイトは最早アクセス不可になっています。
Githubからソースはダウンロード可能なので、頑張ればEclipseにScala IDEを入れれるかもしれません。どうしてもEclipseじゃないといけない方はトライしてみるのも良いかも…。

EclipseのPluginフォルダにファイルを配置すればPluginを導入出来たと思うので、Github上からファイルをダウンロードして入れれば動くかも…しれません。

環境

  • Windows10 Pro
  • AdoptOpenJDK: 8u312
  • Scala: 2.11
  • IntelliJ IDEA Community Edition
  • sbt: 1.5.6

こんなことが出来る

本手順を実行して環境構築すれば最終的に.jarに固めて実行するアプリケーションを作成可能です。

環境構築手順

1. JDKのインストール

下記サイトよりWindows向けのインストーラーをダウンロードして、JDKをインストールします。
インストーラーの指示に従ってインストールすれば基本的には問題無いです。

https://adoptopenjdk.net/

インストール後、環境変数にJAVA_HOME及びPathにJAVA_HOME/binフォルダを設定します。
JAVA_HOMEは存在しなければ新規作成します。
Pathは存在しているので、編集で「%JAVA_HOME%\bin」を追加します。

追加した後はコマンドプロンプトを開いて環境変数が正常に追加されたかを確認します。
下記のようにバージョン情報が表示されれば問題ありません。

C:\Users\User>java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (Temurin)(build 25.312-b07, mixed mode)

C:\Users\User>javac -version
javac 1.8.0_312

2. sbtのインストール

下記よりsbtのインストーラーをダウンロードし、インストーラーを起動します。
インストーラーの指示に従ってインストールを進めます。

https://www.scala-sbt.org/

3. IntelliJ IDEA Community Editionのインストール

下記よりIntelliJ IDEA Community Editionのインストーラーをダウンロードし、インストールを進めます。

https://www.jetbrains.com/ja-jp/idea/

4. IntelliJ IDEAのプラグインをインストール

IntelliJ IDEAを起動した後にFile → Settingsへ進みます。
左側にある設定メニューよりPluginsを選択して、上部タブのMarketplaceを選択します。
検索ボックスにscalaと入力すると恐らく1番上にJetBrains製のScalaPluginが表示されますので、インストールを行います。

プロジェクトを作成する

IntelliJ IDEAを起動した状態で、File → New → Projectを選択して新規プロジェクト作成画面を開きます。
左側のメニューからScalaを選択して、画面中央はsbtを選択した状態でNextをクリックします。

Project Nameを入力、sbt及びScalaのバージョンを選択してFinishをクリックします。
sbtやScalaのバージョンはお好みで設定してください。

プロジェクト作成完了後、空のプロジェクトフォルダができます。
src/main/scala以下にScalaクラスファイルを作成して、サンプルのアプリケーションを作成します。ここでは作成するScala ClassはObjectとして、名称をMainとしました。
この辺りもお好みで設定してください。

新規作成したMain.scalaファイルを開き下記の通り少々書き換えます。
Appを継承して、コンソールにHello World.と出力するだけの簡単なコードになります。

object Main extends App {
  println("Hello World.")
}

以上でプロジェクトを作成することが出来ました。
次に実際にデバッグで実行したり、実行形式の.jarファイルの作成を行います。

デバッグを実行する

これまででプロジェクトを作成することが出来たので、次にデバッグを実行して動作を確認していきます。デバッグをするにはMain.scalaファイルを開いた状態で、Main部分を右クリックするとコンテキストメニューが表示され、その中段付近にDebug ’Main’と表示されるのでそこをクリックするとデバッグが開始されます。
後はお好みでブレークポイントを設定して、デバッグを進めます。

コンソールに Hello World. と表示されました。
この後は自身でコードを書きながらデバッグを進めていきます。

実行形式.jarファイルを作成する

完成したプログラムを実行する場合いくつか方法はありますが、今回は.jarファイルに固めて実行します。この方法を行う前に下記3点の事前準備がありますのでそれぞれ説明していきます。

  1. assemblyを使用するためにsbtのplugin設定を行う。
  2. build.sbtを修正する。
  3. IntelliJへ実行設定を行う。

1. assemblyを使用するためにsbtのplugin設定を行う

ルート直下にあるprojectフォルダを参照してplugins.sbtファイルがあるかを確認します。
無ければ新規作成します。

ファイルを開いて下記を追記します。
x.x.x部分はバージョンになります。最新バージョンであれば概ね問題無い気がしますが、必要に応じて公式のドキュメントを参照して自身の環境に適したバージョンを設定してください。
Github - sbt/sbt-assembly

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "x.x.x")

2. build.sbtを修正する

sbt-assemblyを導入する準備が出来たので、それに合わせてbuild.sbtも修正を行います。
assembly / mainClassで指定してるのは.jar実行時に処理するクラスを指定しています。ここも自身のフォルダ構成に合わせて変更してください。
assembly / assemblyJarNameは.jarファイル生成時のファイル名になります。

ここでassemblyが見当たらなくてエラーになる場合は一旦無視しても大丈夫です。後々assemblyを実行した際にpluginが導入されて、エラーが解消されます。
assemblyを実行してもエラーが解消されない場合は一度IntelliJを再起動すると解消するかと思います。

ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "2.11.6"

lazy val root = (project in file("."))
  .settings(
    name := "test",
    assembly / mainClass := Some("Main"),
    assembly / assemblyJarName := s"${name.value}.jar",
  )

3. IntelliJへ実行設定を行う

最後にIntelliJよりassemblyコマンドを実行する際の設定を行います。
Run → Edit Configurations...を選択します。

次に表示される画面で左上にある+をクリックしてsbt Taskをクリックします。

sbt Taskの設定画面が開くので下記の通り設定を行い、OKをクリックします。

  • Name: build
  • Tasks: assembly
  • Before launch: 設定無し(デフォルトだとbuildが事前作業に入っていますが消します)

その後、Runより設定したsbt Taskを実行します。
コンソール上にsuccessと表示されれば.jarファイルが作成されています。
作成場所はルートフォルダ直下のtarget/scala-2.11以下になります。ただ、IntelliJからは直接見えないので、エクスプローラーから参照した方が早いかもしれません。

最後に生成した.jarファイルを実行してみます。
コマンドプロンプトより、対象フォルダに移動してjavaコマンドにて実行します。
無事にHello World.と表示されるはずです。

まとめ

Eclipseから移行するの面倒だなと思って、今まで無理矢理Eclipseを使用していましたが、IntelliJ IDEAの方がサクサクで早く移行しておけば良かった…。

-技術的な話
-, , ,