After a lot of trial and error, this is the best method I found for packaging the Scala app for distribution:
First, create a Java class to be the main entry point for the application as described by Gary Boon. This allows you to run the application from a JAR with the java command. I found that running a Scala class with the java command is problematic, even when you have the Scala libs on the source path:
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]));
}
}
Now you can use Eclipse's Export Runnable JAR command to package up all your classes and libraries into a JAR file. Set the JAR's main class to the Java entry point. You can also save the Eclipse-generated output settings as an ANT build file so you can make adjustments. Using ANT to create the JAR with a Java entry point yielded best results. You can also package up other JAR dependancies this way which makes it a whole lot simpler when trying to run the JAR on a different host. As a minimum you will need the Scala library and the Scala tools JAR.
<zipfileset excludes="META-INF/*.SF" src="${scala.lib.jar}"/>
<zipfileset excludes="META-INF/*.SF" src="${scala.tools.jar}"/>
If you're using embedded Jetty, as I am, you can run the server as a Daemon process using the following command (source):
nohup java -jar MyJettyServer.jar < /dev/null >> server.log 2>> server_error.log &
This runs the program as a background process which is independent of the current user session so the process will continue after you logout of the host.