How to deploy a Scala project from Eclipse?

倖福魔咒の 提交于 2019-12-03 07:01:43

Sbt supports web application deployments. You can of course use Ant, Maven or another build tools to package your WAR for Jetty deployment. You can start sbt as an external tool from eclipse.

Sbt seems to support JRebel configuration. Once it runs you should be able to change resources and classes from eclipse without an additional war deployment step.

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.

I am doing exactly the same thing: develop server side code that runs inside a plain application that embeds Jetty. Nowadays it is mostly Scala code, it used to be Java. Either way I simply run the Java code from one or more JAR file(s).

In both cases I use Ant for deployment builds. My Scala projects sometimes use existing Java classes. For that I add an Ant target that compiles the Java classes into a JAR that is subsequently used both in my Eclipse Scala plugin and in the Ant deploy build targets.

A simple solution is to create a small Java class that calls the main method of the Scala program. Then, the standard eclipse jar export can be used.

public class Main { 
    public static void main (String[] args) {
        MyScalaObjectWithMainMethod.main(args);
    }
}

Important: Before exporting make sure that scala-library.jar is in the build path as an external jar (not as a library) so that it will be exported together with your jar.

I found this solution as a comment by Jesper Villadsen on Gary Boone's page (who proposes a somewhat complex approach). While I had problems getting to run Gary's solution, this solution by Jesper works perfectly for me. Thanks!

You use eclipses' ability to create a WAR file, just like you would for Java. Or a jar file, just like you would for Java. Because, at run time it is java. No more magic needed.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!