1. プロジェクトコードの実行

プロジェクトコードの実行 

runconsoleアクションは、sbtと同じ仮想マシンでユーザーコードを実行する手段を提供します。

runには、実行したいメインクラスの完全修飾名を指定できる追加の初期引数を取るrunMainというバリアントも存在します。runrunMainは同じ構成を共有しており、個別に構成することはできません。

このページでは、sbtと同じ仮想マシンでユーザーコードを実行する際の問題点、sbtがこれらの問題にどのように対処するか、この機能を使用できるコードの種類、およびフォークされたJVMを使用する必要があるコードの種類について説明します。フォークされたJVMをいつ使用する必要があるかだけを知りたい場合は、ユーザーコードにスキップしてください。

問題点 

System.exit 

ユーザーコードはSystem.exitを呼び出すことができ、これは通常JVMをシャットダウンします。runおよびconsoleアクションはsbtと同じJVM内で実行されるため、これによりビルドも終了し、sbtを再起動する必要があります。

スレッド 

ユーザーコードは他のスレッドを開始することもできます。スレッドはメインメソッドが返された後も実行されたままになる可能性があります。特に、GUIを作成すると、いくつかのスレッドが作成され、その一部はJVMが終了するまで終了しない可能性があります。プログラムは、System.exitが呼び出されるか、すべての非デーモンスレッドが終了するまで完了しません。

デシリアライズとクラスロード 

デシリアライズ中、さまざまな複雑な理由で、誤ったクラスローダーが使用される可能性があります。これは多くのシナリオで発生する可能性があり、SBTで実行することもその1つです。これについては、問題#163と#136で議論されています。理由はこちらで説明されています。