2010-05-27 67 views
11

我有一个Eclipse的Scala项目,我需要打包,所以我可以将其部署到服务器。它基于Jetty,但它作为独立应用程序运行。它包含Scala类,Java类和许多第三方jar。如何从Eclipse部署Scala项目?

我认为在Scala Eclipse插件中会有某种部署选项,但我画了一个空白。

将Scala项目打包为可运行文件以使其可以部署的最简单方法是什么?

任何帮助非常感谢。 干杯。

回答

5

大量的试验和错误之后,这是我发现用于包装Scala的应用程序分配的最佳方法:

首先,创建一个Java类如Gary Boon描述为应用程序的主入口点。这允许您使用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的出口的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}"/> 

如果你正在使用嵌入式码头,因为我,你可以使用下面的命令(source)运行服务器作为守护进程:

nohup java -jar MyJettyServer.jar </dev/null>> server.log 2>> server_error.log & 

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

5

Sbt supports web application deployments。您当然可以使用Ant,Maven或其他构建工具来打包WAR以进行Jetty部署。你可以从eclipse启动sbt作为外部工具。

Sbt似乎支持JRebel配置。一旦运行,你应该能够从eclipse改变资源和类,而无需额外的战争部署步骤。

+0

感谢您的意见。我担心,当谈到Java构建工具时,我有点儿不爽。我不确定是否有WAR文件是我想要的。我在嵌入式模式下运行Jetty,所以我希望将所有东西封装到可运行的JAR或其他东西中。还是我吠叫错了树? – lach 2010-05-27 14:34:33

+0

WAR是标准(SRV.9.6 Web应用程序存档文件 - http://jcp.org/aboutJava/communityprocess/mrel/jsr154/index2.html)打包您的应用程序的servlet容器(http:// wiki.eclipse.org/Jetty/Howto/Deploy_Web_Applications)。 – 2010-05-27 15:06:15

2

我正在做同样的事情:开发在嵌入Jetty的普通应用程序内运行的服务器端代码。现在它主要是Scala代码,它曾经是Java。无论哪种方式,我只需从一个或多个JAR文件运行Java代码。

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

+0

嗨西尔维奥。谢谢!这听起来像我所需要的。你能发表一个你用来构建你的服务器应用程序的ANT文件的例子吗? – lach 2010-05-27 15:07:10

+0

你可以找到一个笨拙的例子: http://www.jambo-software.com/download/build.xml – 2010-05-29 04:52:44

0

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

+0

不,这不适用于我。当jar运行时,没有可选择的类来执行。也许如果你手工制作了罐子,它会起作用吗? – fadedbee 2010-07-04 05:54:34

2

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

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

重要:之前出口确保斯卡拉 - library.jar是在构建路径为外部JAR(而不是作为一个库),这样它会连同您的罐子被导出。

我发现这个解决方案是Jesper Villadsen对Gary Boone's page(谁提出了一个有点复杂的方法)的评论。虽然我在运行Gary的解决方案时遇到了问题,但Jesper的解决方案对我来说非常合适。谢谢!