2009-11-15 4 views
6

La forma habitual de definir main en Scala (como se muestra a continuación) se puede utilizar para ejecutar clases con 'scala', pero no 'java' (ya que el método creado no es estático). ¿Cómo escribo una clase/objeto Scala que se puede ejecutar con 'java'?Scala: definir el método principal que puede ser utilizado por 'java'

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

La pregunta es incorrecta en el sentido de que no se puede ejecutar esto con java, porque el método creado no es estático. Puedes, y el método creado es estático. –

Respuesta

7

Usted es incorrecta. Puede ejecutarlo con "java", y la razón por la que dio por no ser posible no es verdad. Aquí, déjame mostrar qué hay dentro de "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 "[email protected]" 

de Windows:

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

Sin embargo, si le sucede que tiene una clase con el mismo nombre definido, entonces no es un error que podría estar afectando a usted, dependiendo en la versión de Scala que está usando.

+0

Bueno, de hecho funciona para un ejemplo de juguete, en mi código tengo un objeto dentro de una clase y la .class resultante no tiene una estática método principal. – IttayD

+0

Si tiene un objeto dentro de una clase (como 'clase Foo {object Bar {def main (args: Array [String])}}') entonces dudo que esto funcione, por otras razones. –

+1

Este es el error que Daniel señalaba en http: //www.eishay.com/2009/05/scalas-main-issue.html – Ashwin

3

La manera más simple, y el que siempre uso, es definir el objeto (como lo hizo), pero no la correspondiente clase "compañera". En ese caso, el compilador de Scala creará un par de clases, la que tiene el mismo nombre que el objeto contendrá métodos de reenvío estáticos que, para los propósitos de los puntos de entrada del iniciador, son precisamente lo que necesita. La otra clase tiene el nombre de tu objeto con $ anexado y ahí reside el código. Javap revelará estas cosas, si le interesan los detalles.

Así, su ejemplo HelloWorld funcionará como desee, permitiendo esto:

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

Randall Schulz

+0

Quiero ser capaz de hacer 'java pkg.package.more.HelloWorld' – IttayD

7

javap, de hecho, muestran que su principal es estática.

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; 
} 

¿Tal vez solo necesite las jarras de Scala en su classpath?

Hay una pregunta similar aquí en Stack Overflow: "Creating a jar file from a Scala file".

Acabo de verificar que esto funciona con las instrucciones (vinculadas) arriba.

Sólo tiene que ejecutar a través de:

java -jar HelloWorld.jar 
0

¿Alguna vez también definió un class HelloWorld? Hay un error en Scala 2.7.x que impide que se generen los métodos estáticos en la clase HelloWorld cuando se definen tanto object HelloWorld como class HelloWorld.

Cuestiones relacionadas