多くの試行錯誤の末、これは配布用にScalaアプリをパッケージ化するために私が見つけた最良の方法です。
まず、Gary Boonの説明に従って、アプリケーションのメインエントリポイントとなるJavaクラスを作成します。これにより、javaコマンドを使用してJARからアプリケーションを実行できます。ソースパスにScalaライブラリがある場合でも、javaコマンドでScalaクラスを実行すると問題が発生することがわかりました。
import java.util.ArrayList;
import scala.tools.nsc.MainGenericRunner;
public class Main {
public static void main (String[] args) {
ArrayList<String> argList = new ArrayList<String>();
argList.add("fully.qualified.ClassName");
for (String s : args) {
argList.add(s);
}
MainGenericRunner.main(argList.toArray(new String[0]));
}
}
これで、EclipseのExport Runnable JARコマンドを使用して、すべてのクラスとライブラリをJARファイルにパッケージ化できます。JARのメインクラスをJavaエントリポイントに設定します。Eclipseで生成された出力設定をANTビルドファイルとして保存して、調整を行うこともできます。ANTを使用してJavaエントリポイントでJARを作成すると、最良の結果が得られました。この方法で他のJAR依存関係をパッケージ化することもできます。これにより、別のホストでJARを実行しようとするときに非常に簡単になります。少なくとも、ScalaライブラリとScalaツールJARが必要になります。
<zipfileset excludes="META-INF/*.SF" src="${scala.lib.jar}"/>
<zipfileset excludes="META-INF/*.SF" src="${scala.tools.jar}"/>
私のように組み込みJettyを使用している場合は、次のコマンド(ソース)を使用してサーバーをデーモンプロセスとして実行できます。
nohup java -jar MyJettyServer.jar < /dev/null >> server.log 2>> server_error.log &
これにより、現在のユーザーセッションに依存しないバックグラウンドプロセスとしてプログラムが実行されるため、ホストからログアウトした後もプロセスが続行されます。