Scala: определение основного метода, который может использоваться java - PullRequest
6 голосов
/ 15 ноября 2009

Обычный способ определения main в Scala (как показано ниже) может использоваться для запуска классов с 'scala', но не с 'java' (поскольку созданный метод не является статическим). Как мне написать класс / объект Scala, который может быть выполнен с помощью 'Java'?

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

Ответы [ 4 ]

7 голосов
/ 15 ноября 2009

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 из файла Scala ".

Я только что подтвердил, что это работает с инструкциями (ссылка) выше.

Просто запустите через:

java -jar HelloWorld.jar
7 голосов
/ 16 ноября 2009

Вы не правы.Вы можете запустить его с «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  "$@"

Windows:

@echo off
...
if "%_JAVACMD%"=="" set _JAVACMD=java
...
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner  %_ARGS%

Однако , еслиесли у вас определен класс с тем же именем, то есть ошибка, которая может повлиять на вас, в зависимости от используемой вами версии Scala.

3 голосов
/ 15 ноября 2009

Самый простой способ, который я всегда использую, состоит в том, чтобы определить объект (как вы это сделали), но не соответствующий «сопутствующий» класс. В этом случае компилятор Scala создаст пару классов, тот, чье имя точно совпадает с именем объекта, будет содержать статические методы пересылки, которые для целей точек запуска средства запуска - именно то, что вам нужно. Другой класс имеет имя вашего объекта с добавленным $, и именно там находится код. Javap раскроет эти вещи, если вам интересно узнать подробности.

Таким образом, ваш HelloWorld пример будет работать так, как вы хотите, что позволяет:

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

Рэндалл Шульц

0 голосов
/ 16 ноября 2009

Вы также не определили class HelloWorld? В Scala 2.7.x есть ошибка, которая препятствует генерированию статических методов в классе HelloWorld, когда определены и object HelloWorld и class HelloWorld.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...