2011-07-21 167 views
8

我正在用Scala開發Eclipse上的應用程序,並且想創建一個.jar。我發現tuto可以做到這一點,但它使用包scala.tools.nsc,我不知道我在哪裏可以找到這個東西。
我也試過,生成.class,然後用命令jar cmf ....生成.jar,但是當我啓動.jar時發生錯誤。 (NoClassFound)
與sbt我也試過了,但是當我編譯我的項目與eclipse的工作出現很多錯誤。從scala生成.jar

有人可以解釋我如何簡單地使用Eclipse或其他工具創建一個.jar文件。

+0

我糾正的Java CMF'到「罐子CMF」,請查看是否這是確定。並注意常見問題和元和側邊欄,如何編輯您的文章。佈局等。一般來說,當由於錯誤而提出要求時:你究竟做了什麼?命令? Cut'n'paste它,以避免轉移錯誤。複製並粘貼確切的錯誤消息。你在哪個目錄下啓動命令,你的文件結構是什麼,你選擇了哪個項目名稱,文件層次結構是否與目錄相對應?您之前是否使用過'jar',例如使用'Java'並取得了多大的成功?謝謝。 –

回答

3

當你創建一個罐子你的班,可能是依賴不會被包含在罐子。運行該jar時,需要將包含依賴關係的jar放在classpath中(使用-cp切換到java)。最重要的依賴關係是scala-library罐子。當然,知道NoClassDefFound找不到的東西會有所幫助。

SBT

當SBT建設,也許它缺少你已經手工添加到Eclipse項目的依賴? (注意:我沒有使用sbt)。

Maven的

我找到了最清晰和最無痛的方式是一個人去與Maven,或者可能行家+的IntelliJ IDEA(社區版是免費的)+斯卡拉插件。工作非常順利。

對於maven,您需要稍微修改一下可用的scala原型,因爲它引用的庫不是最新的版本,但除此之外它是非常好的。

這裏是一個pom.xml我使用:https://gist.github.com/1096870

使用標準的行家文件夾結構(源根爲src /主/階),然後mvn package創建罐子細。

+0

坦克爲您的答案.. – Snoopy

+0

@Snoopy:不要說'謝謝',但upvote有用的答案。那最好解決你的問題(如果有的話)應該被標記爲接受的答案。 –

11

Eclipse有一個內置選項來生成可運行的jar,但它隱藏得很好。此外,它不識別Scala的main()簽名,因此您將不得不使用main()方法創建Java類。

  1. 與簡單地調用轉發給您的Scala代碼一個main()方法創建一個Java類。

  2. 然後右鍵單擊您新創建的Java類並選擇:運行方式 - > Java應用程序。 這將創建一個可運行的配置,稍後將用作可運行jar的一部分。

  3. 現在,您可以挖掘出從Eclipse的菜單中運行的JAR選項: 文件 - >導出 - >爪哇 - >運行的JAR文件

  4. 在所提出的對話框中選擇您所創建的啓動配置更早(在步驟2中),命名您的jar(myapp.jar),選擇您的依賴項導出選項並單擊完成。

  5. 默認情況下,該jar將在Eclipse的工作區中創建。

  6. 運行使用線路的jar:斯卡拉myapp.jar

你的問題錯過圖片:Eclipse的要求時,文件被添加或刪除手動刷新。右鍵單擊您的項目並選擇刷新。

在高度直觀的Eclipse界面上完成了教程。

注意:Eclipse版本3.6.2的說明。

+0

謝謝,但它不起作用....我用main()創建了一個java類。然後創建.jar,當我想啓動jar時,我的應用程序的名稱出現在菜單和終端上我有這個錯誤:「lang.ClassNotFoundException:scala.ScalaObject」和「java.lang.reflect.InvocationTargetException」並當我想要啓動與行:scala myapp.jar我有這個錯誤「權限被拒絕」 – Snoopy

+0

我已經在Scala上安裝了一個新的版本,這是因爲我有錯誤「權限被拒絕」,但現在我已經與line:scala myapp.jar此錯誤:錯誤:解碼時使用UTF-8解碼/Users/danymorard/Documents/workspace/myAppl1.jar時出現IO錯誤 – Snoopy

+0

自Scala 2.9.0開始支持使用「scala myapp.jar」啓動jar。看起來你已經安裝了一箇舊版本,它試圖將jar作爲腳本文件加載。 嘗試用「java -cp $ SCALA_HOME/lib/scala-library.jar:myapp.jar mypackage.Mymain」啓動jar – Lex

0
% cat a.scala 
package foo 

object Whee { 
    def main(args: Array[String]): Unit = { 
    println("I'm in a jar")  
    } 
} 
% scalac29 -d whee.jar a.scala 
% scala29 -cp whee.jar foo.Whee 
I'm in a jar 
% 
+0

坦克的答案,但我什麼也不明白你在做什麼 – Snoopy

+0

這不會爲你製作一個可運行的jar。它只是在一個jar文件中壓縮你的代碼。爲了使其可運行,您需要在清單中定義主要類。 –

1

使用下面的步驟暫時。但這不是全職解決方案。更好地爲Spark-Scala組合使用sbt構建jar。 使用java類的臨時解決方案,調用scala主類。 MainClass.java

public class MainClass { 
    public static void main(String[] args) { 
     SampleApp app=new SampleApp(); 
     app.main(args); } 
} 

SampleApp.scala

class SampleApp { 
    def main(args: Array[String]) { 
    println("First Scala SampleApp")} 
} 

導出它通過使用正常的java罐出口通過選擇MainClass main方法的廣口瓶中。 將jar文件命名爲Sample.jar 使用以下命令在羣集中運行它。

/spark/bin/spark-submit --class com.scala.MainClass SampleScala.jar

的輸出,你可以爲得到: 首先斯卡拉SampleApp

+0

這是爲我做的。超級討厭Eclipse無法識別Scala主文件! – StackG

+0

另請注意,我創建了一個新的Java項目並添加了Scala庫,如下所示:http://stackoverflow.com/questions/11413888/exporting-scala-project-as-jar-from-eclipse – StackG