2010-05-27 74 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的解決方案對我來說非常合適。謝謝!