1. 概要

Scalaアプリケーションを開発するとき、優れたIDEはコードの品質を大幅に向上させることができます。 IntelliJ IDEAは、Scalaプラグインを備えており、堅牢なアプリケーションを開発するための優れた基盤を提供します。 この記事では、主にSBTを使用してIntelliJをセットアップする方法について説明します。これにより、アプリケーションを実行するための十分なリソースを残しながら、IntelliJを満足させることができます。

Scalaで使用するためにIntelliJをセットアップするには、少し手間がかかることに注意してください。 正しく行われれば、後で困難から私たちを救うでしょう。

この記事で説明する構成オプションと手法は、IntelliJ IDEACommunityEditionとIntelliJUltimateの両方に関連しています。

2. IntelliJIDEAのインストール

IntelliJ自体のインストールは、実行しているOSに関係なく簡単で、このコンパニオンBaeldungの記事基本的なIntelliJ構成で説明されています。

ただし、Scalaコードを書き始める準備はまだ整っていません。 それを行うために他に何を設定する必要があるかを見てみましょう。

3. JDKのインストール

Scalaでは、JDK1.8以降を使用する必要があります。 利用可能なオプションがいくつかあります。

  • 次のセクションで説明する[新しいプロジェクト]パネルで、IntelliJを介してJDKをインストールします
  • 手動インストール—このオプションを検討する主な理由は次のとおりです。
    • OracleJDKを使用する必要があります
    • GraalVM など、リストされていない他のJDKを使用したい

これは主に個人的な好みの領域です。 ただし、1.8より新しいバージョンのJDKを使用する必要がある場合は、サポートされているバージョンのバージョンにさらに注意する必要があることに注意してください。 詳細については、公式のJDK互換性ページを参照してください。

4. プロジェクトの設定

私たちの目標は、2つの主な理由でSBTを使用するようにIntelliJをセットアップすることです。

  • ほとんどの場合、CI/CDプロセスはコマンドラインビルドプロセスに基づいています。 IntelliJ固有のビルドプロセスがそのプロセスに漏れないようにする必要があります
  • 同様に、私たちのチームの全員がIntelliJを使用しているわけではありません。 SBTをベーステクノロジーにすることで、「IDE戦争」を回避することでチームの調和を促進します

SBTはScalaコミュニティで最も人気のあるビルドツールであり、IntelliJによって十分にサポートされているため、ここではSBTに焦点を当てます。

4.1. 新しいプロジェクトの作成

プロジェクトを最初から作成する場合は、「新規プロジェクトの作成」オプションを使用する必要があります。 実際には、このオプションを頻繁に使用することはありませんが、どのように機能するかを知っておくとよいでしょう。

「CreateNewProject」をクリックすると、プロジェクトの作成プロセスを促す「ウィザード」が表示されます。 SBTベースのプロジェクトに焦点を当てているため、重要な考慮事項は次のとおりです。

  • プロジェクト名—すべてのプロジェクトに名前を付ける必要があります。 Scalaのコンベンションでは、「my-first-scala-project」などの「ケバブケース」を推奨しています
  • JDK —すでにインストールされているJDKを選択するか、新しいインスタンスをダウンロードしてそれを使用できます
  • SBTバージョン—組織が特定のバージョンを指定しない限り、通常は最新バージョンを使用する必要があります
  • Scalaバージョン—繰り返しますが、Scala 2.13以降を使用しない理由がない限り、Scalaの最新バージョンを使用する必要があります

記入するとフォームは次のようになります。

「完了」をクリックすると、基本的なScalaプロジェクトディレクトリ構造とともにプロジェクトが作成されます。

ただし、これでプロジェクトが完全に設定されるわけではありません。

デフォルトでは、IntelliJは独自のビルドプロセスを使用してScalaプログラムをビルドします。 ただし、SBTを使用していることを確認する必要があるため、これは私たちが望んでいることではありません。

これを有効にするには、プロジェクトの設定に移動して、その動作を指定する必要があります。

設定パネルを開き(これはOSによって異なりますが、IntelliJのトップレベルメニューからいつでもアクセスできます)、「sbt」を検索します。 次のようなパネルが表示されます。

「sbtシェルを使用する」というラベルの横にあるチェックボックスに注意してください。 「インポート用」と「ビルド用」を有効にして、「OK」をクリックします。 これにより、IntelliJはSBTのインスタンスを実行して、プロジェクトの依存関係を構築および管理します。

ここで、ビルドアイコン(?の付いたボタン)をクリックすると、 画像)、IntelliJがSBTのインスタンスを開始して、「sbtターミナル」ウィンドウでプロジェクトをビルドするのを確認する必要があります。

4.2. バージョン管理を開くか、インポート/取得する

これらの2つのオプションはほとんど同じです。 「開くまたはインポート」の場合、コンピュータにすでに存在するディレクトリからプロジェクトを設定します。

「バージョン管理から取得」を使用すると、リモートリポジトリにプッシュされたプロジェクトを作成するように求められます。 後者の場合、IntelliJは、プロジェクトを設定する場所を指定するためのガイドを提供します。 これは、チーム開発で発生する状況です。

いずれの場合も、IntelliJは、プロジェクトのルートディレクトリにbuild.sbtファイルがあるプロジェクトがSBTを使用してインポートできることを「認識」しています。 繰り返しになりますが、前のセクションで説明したように、設定に移動して「sbtシェルを使用する」設定を有効にする必要があります。

5. Scalaアプリケーションの構築と実行

プロジェクトをIntelliJにブートストラップしましたが、特に大規模なプロジェクトに取り組んでいる場合は、完全に完了しているわけではありません。

SBTの制御下でプログラムを実行すると、自動再コンパイルまたは「ホットロード」機能が提供されます。 ただし、大規模なアプリケーションで作業する場合、この機能に依存することは困難な場合があります。 この理由は、Scalaコンパイラが大規模なコードベースに必要なメモリの量です。

このユースケースでメモリ使用量を最適化する方法を見てみましょう。

5.1. Scalaコンパイルの最適化

ここでも、SBT構成パネルに戻ると、使用できるメモリの最大量を指定できるフィールドがあることがわかります。

この制限を上げると、Scalaコンパイラーのパフォーマンスが大幅に向上します。 たとえば、8 GBのメモリを割り当てる必要がある場合は、これを8192と指定します。

特に、アプリケーションを最初から再コンパイルする必要がある場合は常に、SBTを使用してこれを行う必要があります。

必要に応じて大量のメモリを割り当てることができます。その後、アプリケーションを実行するときに、より適切な量のメモリを指定できます。 コンピューターのメモリが本当に不足している場合は、IntelliJの「sbtterminal:」ウィンドウの左側にある赤いボックスをクリックするだけで、SBTプロセスを強制終了することもできます。

5.2. Scalaアプリケーションの実行

「run」コマンドを実行することで、SBTからScalaアプリケーションを実行できます。 ただし、SBTに大量のメモリを割り当てた場合、アプリケーションで使用できるメモリの量が制限される可能性があります。 この問題を回避するために、アプリケーションの「実行構成」を作成できます。

アプリケーションの実行構成を作成する最も簡単な方法は、次の図に示すように、メインのエントリポイントに移動し、緑色の二重矢印をクリックすることです。

次に、構成を実行し、これも強調表示して、メモリの量を設定します。

「SampleApp」(またはアプリケーションの名前)をクリックして、「構成の編集…」を選択します。 「SampleApp」を選択すると、アプリのVMオプションを設定できます。 SBTのメガバイト設定とは異なり、これらは標準のJVM設定です。 4GBのヒープが必要な場合は、-Xmx4GB。と指定します。

この値は、前のステップでSBTに指定されたメモリーの量と同じである必要はありません。 これにより、たとえば、より小さなメモリサイズを設定できます。

このアプローチの1つの欠点は、開発モードでのホットリロードをサポートするPlayなどのフレームワークを使用していない場合、アプリケーションを変更するたびに手動で再起動する必要があることです。 sbt で「run〜」コマンドを使用すると、メモリの使用量が増える可能性がありますが、ホットリロードが発生します。

6. 結論

この記事では、SBTを使用したScala開発用のIntelliJのセットアップの基本を示しました。 また、ビルド構成と実行構成を分離することで、メモリの量を最適化する方法についても検討しました。