run
とconsole
アクションは、sbtと同じ仮想マシンでユーザーコードを実行する手段を提供します。
run
には、実行したいメインクラスの完全修飾名を指定できる追加の初期引数を取るrunMain
というバリアントも存在します。run
とrunMain
は同じ構成を共有しており、個別に構成することはできません。
このページでは、sbtと同じ仮想マシンでユーザーコードを実行する際の問題点、sbtがこれらの問題にどのように対処するか、この機能を使用できるコードの種類、およびフォークされたJVMを使用する必要があるコードの種類について説明します。フォークされたJVMをいつ使用する必要があるかだけを知りたい場合は、ユーザーコードにスキップしてください。
ユーザーコードはSystem.exit
を呼び出すことができ、これは通常JVMをシャットダウンします。run
およびconsole
アクションはsbtと同じJVM内で実行されるため、これによりビルドも終了し、sbtを再起動する必要があります。
ユーザーコードは他のスレッドを開始することもできます。スレッドはメインメソッドが返された後も実行されたままになる可能性があります。特に、GUIを作成すると、いくつかのスレッドが作成され、その一部はJVMが終了するまで終了しない可能性があります。プログラムは、System.exit
が呼び出されるか、すべての非デーモンスレッドが終了するまで完了しません。
デシリアライズ中、さまざまな複雑な理由で、誤ったクラスローダーが使用される可能性があります。これは多くのシナリオで発生する可能性があり、SBTで実行することもその1つです。これについては、問題#163と#136で議論されています。理由はこちらで説明されています。