para - ¿Cómo ejecutar un script de Scala dentro de IntelliJ IDEA?
scala para intellij (4)
Hay 2 cosas que entender primero. Scala funciona como intérprete y compilador. Está intentando con el intérprete "scala test.scala" sin usar "scalac test.scala" y el intérprete también funciona sin el método principal.
Otra forma de hacerlo en intellij es abrir el terminal o el símbolo del sistema en intellij y ejecutar scala test.scala desde la ubicación del archivo (el requisito previo es scala en la ruta actual del sistema)
Aquí hay un script de Scala trivial:
object test {
def hi() { print("hi there from here") }
}
test.hi()
Desde la línea de comando hace lo esperado:
scala /shared/scaladem/src/main/scala/test.scala
Loading /shared/scaladem/src/main/scala/test.scala...
defined module test
hi there from here
Welcome to Scala version 2.10.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_65).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
Pero dentro de Intellij da un error de compilación. Clic derecho | Ejecutar test.scala
expected class or object definition
test.hi()
^
Por cierto, también traté de correr como una hoja de trabajo de Scala. Eso fue MUCHO peor - toneladas de salida de basura y ni siquiera se acercaron a la compilación.
Actualización : parece que hay una pregunta más antigua pero similar:
Cómo ejecutar código Scala en Intellij Idea 10
Entré en Ejecutar configuración y desmarque "Hacer" según las instrucciones (esto era molesto, pero que así sea ...)
Sin embargo, después de hacer ese cambio me sale un error diferente:
Exception in thread "main" java.lang.NoClassDefFoundError: scala/Either
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:113)
Caused by: java.lang.ClassNotFoundException: scala.Either
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 3 more
Nota: la Scala-Library está correctamente configurada:
Otra actualización (después del comentario de @lhuang a continuación) seguí la sugerencia de crear otro proyecto desde cero. En ese caso, una hoja de trabajo de Scala funcionó correctamente (test.sc). Pero un script de scala (que funciona cuando se ejecuta la línea de comandos a través de "scala test.scala") todavía no funciona, incluso en este nuevo proyecto "scala".
La respuesta aquí es una combinación de elementos:
- (a) crear un nuevo proyecto Scala (como lo sugiere @lhuang) y
- (b) al ejecutar un script, debe ir a Ejecutar configuración y eliminar el paso de creación (como se menciona en la pregunta de SOF "relacionada").
Esto muestra bordes ásperos con Intellij y su complemento scala. Especialmente cuando quiero integrar scala con java es aparentemente difícil si es posible usar Intellij en este momento (la necesidad de crear un nuevo proyecto de Scala con frecuencia no es una opción para la mayoría de los proyectos java que intentan incorporar scala).
Pero para los proyectos de Scala-First parece que esto puede ser viable.
Lo que me funciona, es:
- Escribir un script de Scala, por ejemplo, MyScript.scala
- En el menú seleccione: Ejecutar -> Editar Configuraciones ...
- Presione el botón "+" (⌘N también funciona en Mac en este cuadro de diálogo)
- Seleccione "Scala Script"
- Luego seleccione su archivo de Script en este diálogo
Ahora puedes ejecutar tu script. Es un poco inconveniente, pero funciona.
Nota: Esto funciona para mí en IntelliJ IDEA 14.x
Su código funciona en la línea de comandos porque es "script", cuando desea que se pueda ejecutar en un proyecto, hay formas de hacerlo :
Al crear un objeto que extiende la aplicación.
object test { def hi() { print("hi there from here") } } object runnable extends App { test.hi() }
o una solución similar a Java, es decir, creando un método principal
object test { def hi() { print("hi there from here") } } object runnable { def main(args: Array[String]) { test.hi() } }
cuando necesite ejecutarse como script: lo hago así: seleccione el código para ejecutar con el mouse, luego elija del menú contextual "Enviar selección a la consola Scala"