2009-11-15 11 views
6

Scalaのmainを定義する通常の方法は、 'scala'ではなく 'java'ではなく(作成されたメソッド静的ではありません)。 'java'で実行できるScalaクラス/オブジェクトを作成するにはどうしたらいいですか?Scala: 'java'で使用できるmainメソッドを定義する

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

作成されたメソッドが静的ではないため、javaでこのようなことを実行できないと誤って質問されています。できますし、作成されたメソッドは静的です。 –

答えて

7

。あなたは "java"でそれを動かすことができます。あなたができなかった理由は真実ではありません。ここで、「スカラ」の中身を見せてください。

の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 "[email protected]" 

のWindows:あなたが定義した同じ名前のクラスを持って起こる場合は

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

は、あなたに影響を与える可能性がありますバグ、依存がありますあなたが使っているScalaのバージョンで。

+0

まあ、それは実際におもちゃの例のために働く、私のコードで私はクラス内のオブジェクトを持っていて、結果の.classは静的主な方法。 – IttayD

+0

クラス内にオブジェクトがある場合( 'class Foo {オブジェクトBar {def main(args:Array [String])}}')、他の理由でこれがうまくいくとは思えません。 –

+1

ダニエルがhttp://www.eishayを指し示していたバグです。com/2009/05/scalas-main-issue.html – Ashwin

3

最も簡単な方法は、と私は常に使用するものは、オブジェクトを定義することです(あなたが行ったように)が、ない対応する「コンパニオン」クラス。その場合、Scalaコンパイラはクラスのペアを作成します。名前がオブジェクトと正確に同じものは、ランチャーエントリポイントの目的のために必要な静的転送メソッドを含みます。もう一方のクラスにはオブジェクトの名前が$付きで付加されています。これはコードが存在する場所です。詳細について興味があるなら、Javapはこれらのことを明らかにするでしょう。

あなたが望むようしたがって、あなたのHelloWorldの例は、このことができ、動作します:

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

ランドール・シュルツ

+0

私は 'java pkg.package.more.HelloWorld'を行うことができるようにしたい – IttayD

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 jarsが必要なのでしょうか?

Stack Overflowについても同様の質問があります: "Creating a jar file from a Scala file"

これは、上記の手順(リンクされた)で動作することを確認しました。

だけを経由して実行します:あなたは間違ってい

java -jar HelloWorld.jar 
0

class HelloWorldも定義しましたか? Scala 2.7.xには、object HelloWorldclass HelloWorldの両方が定義されているときに、HelloWorldクラスの静的メソッドが生成されないというバグがあります。

関連する問題