如何从Eclipse部署Scala项目?

如何从Eclipse部署Scala项目?,eclipse,scala,jetty,embedded-jetty,Eclipse,Scala,Jetty,Embedded Jetty,我在Eclipse中有一个Scala项目,需要打包,以便将其部署到服务器。它基于Jetty,但作为独立应用程序运行。它包含Scala类、Java类和许多第三方JAR 我假设Scala Eclipse插件中会有某种部署选项,但我画了一个空白 将Scala项目打包成可运行文件以便部署的最简单方法是什么 非常感谢您的帮助。 干杯。Sbt。当然,您可以使用Ant、Maven或其他构建工具为Jetty部署打包WAR。您可以从eclipse将sbt作为外部工具启动 Sbt似乎支持配置。一旦它运行,您应该能够

我在Eclipse中有一个Scala项目,需要打包,以便将其部署到服务器。它基于Jetty,但作为独立应用程序运行。它包含Scala类、Java类和许多第三方JAR

我假设Scala Eclipse插件中会有某种部署选项,但我画了一个空白

将Scala项目打包成可运行文件以便部署的最简单方法是什么

非常感谢您的帮助。 干杯。

Sbt。当然,您可以使用Ant、Maven或其他构建工具为Jetty部署打包WAR。您可以从eclipse将sbt作为外部工具启动


Sbt似乎支持配置。一旦它运行,您应该能够从eclipse中更改资源和类,而无需额外的war部署步骤。

我正在做完全相同的事情:开发运行在嵌入Jetty的普通应用程序中的服务器端代码。现在主要是Scala代码,以前是Java。无论哪种方式,我都只是从一个或多个JAR文件运行Java代码


在这两种情况下,我都使用Ant进行部署构建。我的Scala项目有时使用现有的Java类。为此,我添加了一个Ant目标,它将Java类编译成一个JAR,随后在我的EclipseScala插件和Ant部署构建目标中使用该JAR。

您可以使用eclipses的能力创建WAR文件,就像在Java中一样。或者一个jar文件,就像Java一样。因为在运行时它是java。
不需要更多的魔法。

经过多次尝试和错误,这是我找到的包装Scala应用程序以供分发的最佳方法:

首先,创建一个Java类作为应用程序的主要入口点,如所述。这允许您使用java命令从JAR运行应用程序。我发现使用java命令运行Scala类是有问题的,即使源路径上有Scala libs:

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]));
    }
}
import java.util.ArrayList;
导入scala.tools.nsc.MainGenericRunner;
公共类主{
公共静态void main(字符串[]args){
ArrayList argList=新建ArrayList();
argList.add(“fully.qualified.ClassName”);
for(字符串s:args){
argList.add(s);
}
MainGenericRunner.main(argList.toArray(新字符串[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>server.log 2>>server\u error.log&

这将作为后台进程运行程序,该进程独立于当前用户会话,因此在您注销主机后该进程将继续。

一个简单的解决方案是创建一个调用Scala程序主方法的小型Java类。然后,可以使用标准的EclipseJAR导出

public class Main { 
    public static void main (String[] args) {
        MyScalaObjectWithMainMethod.main(args);
    }
}
重要提示:导出之前,请确保scala-library.jar作为外部jar(而不是库)位于构建路径中,以便将其与jar一起导出


我在Jesper Villadsen的评论中找到了这个解决方案(他提出了一种有点复杂的方法)。虽然我在运行Gary的解决方案时遇到问题,但Jesper的这个解决方案对我来说非常适合。谢谢

谢谢你的意见,托马斯。对于Java构建工具,我恐怕有点生疏。我不确定我想要的是不是战争文件。我在嵌入式模式下运行Jetty,所以我希望将所有内容打包到一个可运行的JAR或其他东西中。还是我找错了方向?WAR是将应用程序打包为servlet容器()的标准(SRV.9.6 Web应用程序归档文件)方式。您好,Silvio。谢谢这听起来正是我需要的。你可以发布一个用于构建服务器应用程序的ANT文件的示例吗?你可以在下面找到一个笨拙的示例:不,这对我不适用。运行jar时,类没有可选择的执行选项。也许如果你手工制作这个罐子会有用?
public class Main { 
    public static void main (String[] args) {
        MyScalaObjectWithMainMethod.main(args);
    }
}