【问题标题】:Scala: defining main method that can be used by 'java'Scala:定义“java”可以使用的主要方法
【发布时间】:2010-12-16 19:12:29
【问题描述】:

Scala 中定义main 的常用方法(如下所示)可用于运行带有'scala' 的类,但不能用于运行带有'java' 的类(因为创建的方法不是静态的)。如何编写可以用“java”执行的 Scala 类/对象?

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}

【问题讨论】:

  • 这个问题是不正确的,因为假设你不能用java运行这个东西,因为创建的方法不是静态的。可以,而且创建的方法是静态的。

标签: scala


【解决方案1】:

你错了。你可以用“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 版本。

【讨论】:

  • 嗯,它确实适用于一个玩具示例,在我的代码中,我有一个类内部的对象,而生成的 .class 没有静态 main 方法。
  • 如果你在一个类中有一个对象(如class Foo{ object Bar{ def main(args: Array[String]) } }),那么我怀疑这会起作用,出于其他原因。
  • 这是丹尼尔指向eishay.com/2009/05/scalas-main-issue.html的错误
【解决方案2】:

javap 实际上会告诉你你的 main 是静态的。

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

【讨论】:

    【解决方案3】:

    最简单的方法,也是我一直使用的方法,是定义对象(就像您所做的那样),但不是相应的“伴侣”类。在这种情况下,Scala 编译器将创建一对类,其名称与对象完全相同的类将包含静态转发方法,出于启动器入口点的目的,这正是您所需要的。另一个类的对象名称带有 $ 附加,这就是代码所在的位置。如果您对细节感到好奇,Javap 会公开这些内容。

    因此,您的 HelloWorld 示例将按照您的意愿工作,允许这样做:

    % scala pkg.package.more.HelloWorld args that you will ignore

    兰德尔·舒尔茨

    【讨论】:

    • 我希望能够做到'java pkg.package.more.HelloWorld'
    【解决方案4】:

    您是否也定义了class HelloWorld? Scala 2.7.x 中有一个错误,当 object HelloWorldclass HelloWorld 都被定义时,会阻止生成 HelloWorld 类的静态方法。

    【讨论】:

      猜你喜欢
      • 2014-06-18
      • 2019-06-18
      • 2015-06-02
      • 2012-11-11
      • 2017-10-19
      • 2018-02-20
      • 2018-07-26
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多