在Scala中定义main的常用方法(如下所示)可用于运行带有'scala'的类,但不能运行'java'(因为创建的方法不是静态的)。如何编写可以用'java'执行的Scala类/对象?
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
答案 0 :(得分:7)
javap实际上会告诉你你的主要是静态的。
javap HelloWorld
Compiled from "HelloWorld.scala"
public final class HelloWorld extends java.lang.Object{
public static final void main(java.lang.String[]);
public static final int $tag() throws java.rmi.RemoteException;
}
也许您只需要在类路径上使用Scala jar?
Stack Overflow上有一个类似的问题:“Creating a jar file from a Scala file”。
我刚刚验证了这项工作与上面的说明(链接)。
直接通过:
java -jar HelloWorld.jar
答案 1 :(得分:7)
你错了。你可以用“java”运行它,你给出的不可能的原因是不正确的。在这里,让我展示“scala”里面的内容。
Unix的:
#!/bin/sh
...
exec "${JAVACMD:=java}" $JAVA_OPTS -cp "$TOOL_CLASSPATH" -Dscala.home="$SCALA_HOME" -Denv.classpath="$CLASSPATH" -Denv.emacs="$EMACS" scala.tools.nsc.MainGenericRunner "$@"
视窗:
@echo off
...
if "%_JAVACMD%"=="" set _JAVACMD=java
...
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner %_ARGS%
然而,如果您碰巧有一个定义了相同名称的类,那么可能会有一个可能影响您的错误,具体取决于您使用的Scala版本。
答案 2 :(得分:3)
最简单的方法,也就是我经常使用的方法,是定义对象(就像你做的那样),但是不是相应的“伴侣”类。在这种情况下,Scala编译器将创建一对类,其名称与对象完全相同的类将包含静态转发方法,出于启动器入口点的目的,这些方法正是您所需要的。另一个类具有附加$的对象的名称,这是代码所在的位置。如果你对细节感到好奇,Javap会透露这些事情。
因此,您的HelloWorld
示例将按您的意愿运行,允许:
% scala pkg.package.more.HelloWorld args that you will ignore
答案 3 :(得分:0)
你碰巧也定义了class HelloWorld
吗? Scala 2.7.x中存在一个错误,它会在HelloWorld
和object HelloWorld
定义时阻止class HelloWorld
类上的静态方法生成。