Generate .jar from scala



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

谁能告诉我如何用Eclipse或其他工具简单地创建一个。jar文件。

Eclipse有一个内置选项来生成可运行的jar文件,但是它隐藏得很好。而且它不能识别Scala的main()签名,所以你必须创建一个带有main()方法的Java类。

  1. 创建一个带有main()方法的Java类,该方法可以简单地将调用转发给Scala代码。

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

  3. 现在你已经准备好从Eclipse的菜单中找出可运行的jar选项:文件->导出-> Java ->可运行JAR文件

  4. 在呈现的对话框中选择您之前创建的Launch Configuration(在步骤2中),命名您的jar (myapp.jar),选择依赖项导出选项并单击finish。

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

  6. scala myapp.jar

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

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

注意:Eclipse版本3.6.2的说明。

jar

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

Sbt

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

Maven

我发现最清晰、最轻松的方法是单独使用maven,或者maven + Intellij Idea(社区版免费)+ Scala Plugin。非常流畅。

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

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

使用标准的maven文件夹结构(源目录是src/main/scala),然后mvn package创建jar fine。

暂时使用下面的步骤,但这不是完全的解决方案。最好为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")}  
}

通过选择MainClass主方法,使用普通java jar导出将其导出为jar。将jar文件命名为Sample.jar

使用以下命令在集群中运行。

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

你可以得到的输出如下:第一个Scala SampleApp

% 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
%

以@Kumar Basapuram写的内容为基础:

创建一个名为"Wrapper.java"的java类

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

将此主方法链接到"SampleApp. js"中的主方法。scala"阶级。

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图

右键单击项目scalapracticcreation。单击Export……单击Java文件夹下的可运行JAR文件将Scala类导出为jar文件图片

点击下一步>

选择Wrapper - ScalaPracticeCreations

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

在"Library"下面选择"Extract required libraries into generated JAR"处理:"选项

单击Finish

在Eclipse IDE中运行这个文件,它就可以工作了。

通过命令提示符运行它,它不起作用。命令提示符图片

要解决这个问题,请从"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));"来取代Wrapper.java类中的"app.main(args);"

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

现在重新导出程序后运行它。命令提示符成功图

现在可以了

这里是额外的填充。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。

最新更新