我正在使用Scala在Eclipse上开发一个应用程序,并希望创建一个.jar。我发现tuto是这样做的,但它使用的是scala.tools.nsc软件包,我不知道在哪里可以找到这个东西。
我也尝试过生成.class然后使用命令jar cmf ....
来生成.jar
但是当我启动.jar
时会发生错误。 (NoClassFound)
有了sbt我也尝试了,但是当我编译与eclipse一起工作的项目时会出现很多错误。
有人可以向我解释如何使用Eclipse或其他工具简单地创建.jar。
答案 0 :(得分:11)
Eclipse有一个内置选项来生成可运行的jar,但是它被很好地隐藏了。此外,它无法识别Scala的main()签名,因此您必须使用main()方法创建Java类。
使用main()方法创建一个Java类,该方法只是将调用转发给您的Scala代码。
然后右键单击新创建的Java类并选择:Run As - > Java应用程序。 这将创建一个可运行的配置,稍后将其用作可运行jar的一部分。
现在您已准备好从Eclipse的菜单中挖掘出runnable jar选项: 档案 - >出口 - > Java - > Runnable JAR文件
在显示的对话框中,选择您之前创建的启动配置(在步骤2中),命名您的jar(myapp.jar),选择您的依赖项导出选项,然后单击“完成”。
默认情况下,jar将在Eclipse的工作区中创建。
使用以下行运行jar:scala myapp.jar
关于缺少图像的问题: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。