2009-11-15 3 views
6

Scala에 main을 정의하는 일반적인 방법은 'scala'가 아닌 'java'가 아닌 클래스를 실행하는 데 사용될 수있다. (생성 된 메소드 정적이지 않습니다). 'java'로 실행될 수있는 스칼라 클래스/객체를 작성하려면 어떻게해야합니까?스칼라 : 'java'가 사용할 수있는 메인 메소드를 정의한다.

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

생성 된 메서드가 정적이 아니기 때문에 java로이 항목을 실행할 수 없다고 가정하면 질문에 잘못되었습니다. 할 수 있고 생성 된 메서드는 정적입니다. –

답변

7

당신은 잘못된 :

그냥 통해 실행합니다. 당신은 "java"로 실행할 수 있으며, 당신이 허용하지 않은 이유는 사실이 아닙니다. 여기서, "스칼라"안에 무엇이 있는지 보여 드리겠습니다.

유닉스 :

#!/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]" 

윈도우 : 사용자가 정의한 같은 이름의 클래스가 일어날 경우

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

, 다음이 당신에 영향을 미칠 수 벅스 따라 사용중인 스칼라 버전.

+0

음, 실제로 장난감 예제에서 작동합니다. 코드 내에서 클래스 내부에 객체가 있고 결과 .class에 정적 객체가 없습니다. 주요 방법. – IttayD

+0

클래스의 내부에 객체가 있다면 (다른 클래스의 경우'class Foo {object Bar {def main (args : Array [String])}}')이 작업을 수행 할 수 있을지는 의문입니다. –

+1

Daniel이 http : //www.eishay를 가리키는 버그입니다.co.kr/2009/05/scalas-main-issue.html – Ashwin

3

가장 간단한 방법은, 내가 항상 사용하는 하나의 객체를 정의하는 것입니다 (당신처럼)하지만 하지 해당 "동반자"클래스입니다. 이 경우 스칼라 컴파일러는 클래스 쌍을 생성합니다. 이름이 객체와 정확히 일치하는 클래스는 실행 프로그램 시작점을 위해 필요한 항목 인 정적 전달 방법을 포함합니다. 다른 클래스에는 오브젝트의 이름이 $로 추가되어 코드가 상주합니다. 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; 
} 

아마도 클래스 경로에 스칼라 병이 있어야할까요?

Stack Overflow에서 비슷한 질문이 있습니다 : "Creating a jar file from a Scala file".

방금 ​​위의 지침 (링크 된)에 따라 작동하는지 확인했습니다.

java -jar HelloWorld.jar 
0

class HelloWorld도 정의 했습니까? 스칼라 2.7.x에는 object HelloWorldclass HelloWorld이 정의되어있을 때 HelloWorld 클래스의 정적 메서드가 생성되지 않도록하는 버그가 있습니다.

관련 문제