从scala生成.jar

时间:2011-07-21 08:22:50

标签: eclipse scala jar

我正在使用Scala在Eclipse上开发一个应用程序,并希望创建一个.jar。我发现tuto是这样做的,但它使用的是scala.tools.nsc软件包,我不知道在哪里可以找到这个东西。
我也尝试过生成.class然后使用命令jar cmf ....来生成.jar但是当我启动.jar时会发生错误。 (NoClassFound)
有了sbt我也尝试了,但是当我编译与eclipse一起工作的项目时会出现很多错误。

有人可以向我解释如何使用Eclipse或其他工具简单地创建.jar。

5 个答案:

答案 0 :(得分:11)

Eclipse有一个内置选项来生成可运行的jar,但是它被很好地隐藏了。此外,它无法识别Scala的main()签名,因此您必须使用main()方法创建Java类。

  1. 使用main()方法创建一个Java类,该方法只是将调用转发给您的Scala代码。

  2. 然后右键单击新创建的Java类并选择:Run As - > Java应用程序。 这将创建一个可运行的配置,稍后将其用作可运行jar的一部分。

  3. 现在您已准备好从Eclipse的菜单中挖掘出runnable jar选项: 档案 - >出口 - > Java - > Runnable JAR文件

  4. 在显示的对话框中,选择您之前创建的启动配置(在步骤2中),命名您的jar(myapp.jar),选择您的依赖项导出选项,然后单击“完成”。

  5. 默认情况下,jar将在Eclipse的工作区中创建。

  6. 使用以下行运行jar:scala myapp.jar

  7. 关于缺少图像的问题:Eclipse需要在添加或删除文件时手动刷新。右键单击您的项目,然后选择Refresh。

    关于高度直观的Eclipse界面的教程到此结束。

    注意:Eclipse版本3.6.2的说明。

答案 1 :(得分:3)

<强>罐

当您从类中创建一个jar时,可能该依赖项不包含在该jar中。运行该jar时,需要将包含依赖项的jar放在类路径上(使用-cp开关到java)。最重要的依赖是scala-library jar。当然知道NoClassDefFound找不到的东西会有所帮助。

<强> SBT

使用sbt构建时,可能缺少手动添加到Eclipse项目的依赖项? (注意:我没有使用sbt)。

<强>的Maven

我发现最清晰,最无痛的方法是单独使用maven,或者可能是maven + Intellij Idea(社区版是免费的)+ Scala插件。工作非常顺利。

对于maven,你需要调整一下可用的scala原型,因为它引用的库不是最新的版本,但除此之外它非常好。

以下是pom.xml我使用的https://gist.github.com/1096870

使用标准maven文件夹结构(source root是src / main / scala),然后mvn package创建jar。

答案 2 :(得分:1)

暂时使用以下步骤。但这不是全时解决方案。更好的是为Spark-Scala组合使用sbt build 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")}  
}

通过选择MainClass main方法,使用普通的java jar导出将其导出为jar。 将jar文件命名为Sample.jar 使用以下命令在Cluster中运行它。

  

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

您可以获得的输出为: 第一个Scala SampleApp

答案 3 :(得分: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
%

答案 4 :(得分:0)

建立@Kumar Basapuram所写的内容:

创建一个名为“Wrapper.java”的java类。

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

将此main方法链接到“SampleApp.scala”类中的main方法。

package animals
class SampleApp {
  def main(args: Array[String]){
     var c = new Cow("Bessie", 100)
     println(c.speak)
     var h = new Horse("CJ", 50)
     println(h.speak)
     var s = new Sheep("Little Lamb", 25)
     println(s.speak)

     println(s.weigh)
     println(h.weigh)
     println(c.weigh)
  }
}

Project with Java and Scala Classes Picture

右键单击Project ScalaPracticeCreation。 单击导出... 单击Java文件夹下的Runnable JAR文件 Exporting Scala Class into a jar Executable Picture

点击下一步&gt;

选择包装 - ScalaPracticeCreations

选择将目的地导出到计算机上的某个位置

在“库”下选择“将所需库提取到生成的JAR” 处理:“选项

单击“完成”

通过Eclipse IDE运行该文件,它可以正常工作。

通过命令提示符运行它,它不起作用。 Command Prompt Picture

要解决此问题,请从“SampleApp.scala”中删除println方法。

package animals
class SampleApp {
  def main(args: Array[String]) {
    var c = new Cow("Bessie", 100)
    var h = new Horse("CJ", 50)
    var s = new Sheep("Little Lamb", 25)
    c.weigh().toString()
  }
}

添加“System.out.println(app.main(args));”替换“app.main(args);”在Wrapper.java类中

package animals;
public class Wrapper {
    public static void main(String[] args) {
        SampleApp app=new SampleApp();
        System.out.println(app.main(args));
    }
}

现在运行后重新导出程序。 success in the command prompt Picture

现在可行。

这是额外的填充.scala类。请注意,Demo.scala类是无关紧要的。

Weight.scala:

package animals
abstract class Weight(size: Int) {
  def weigh = "My size is " + size
}

Animal.scala:

package animals
abstract class Animal(name: String, weight: Int) extends Weight(weight){
  def speak = name + " says " + sound
  def sound: String
  override def weigh() = "My name is " + name + " and I weigh: " + weight
}

Cow.scala:

package animals
class Cow (name: String, weight: Int) extends Animal(name,weight){
  override def sound() = "mooooo"
}

Horse.scala:

package animals
class Horse (name: String, weight: Int) extends Animal(name,weight){
  override def sound() = "neigh"
}

Sheep.scala:

package animals    
class Sheep (name: String, weight: Int) extends Animal(name,weight) {
  override def sound() = "baaaa"
}

请注意,尽管这是一个功能性解决方案,但这可能不是最佳解决方案。 Scala sbt可能是更好的解决方案:Scala sbt或此Scala sbt-assembly