2012-10-16 8 views
10

Non ho esperienza con Scala, quindi questa domanda potrebbe essere elementare. Sto cercando di utilizzare la classe Scala da Java, in base all'esempio "Persona" in questo tutorial: http://www.codecommit.com/blog/java/interop-between-java-and-scalaNoClassDefFoundError che utilizza la classe Scala da Java

Creo due file di origine, uno Scala e uno Java, come segue.

Person.scala:

class Person { 
    def getName() = "Daniel Spiewak" 
} 

Test.java:

public class Test { 
    public static void main(String[] args) { 
    Person p = new Person(); 
    p.getName(); 
    } 
} 

posso compilare (con un avvertimento che non capisco), ma ottengo un ClassNotFoundException quando provo a correre il programma.

 
$ scalac Person.scala 
$ javac Test.java 
./Person.class: warning: Cannot find annotation method 'bytes()' in type 'ScalaSignature': class file for scala.reflect.ScalaSignature not found 
1 warning 
$ java Test 
Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:787) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:447) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
     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:423) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
     at Test.main(Test.java:3) 
Caused by: java.lang.ClassNotFoundException: scala.ScalaObject 
     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:423) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
     ... 13 more 

Qualche idea di cosa sto facendo male?

+0

Causa per l'eccezione è [qui] (http://javarevisited.blogspot.in/2011/06/noclassdeffounderror-exception-in.html) si prega di rivedere – gks

+2

Forse includi scala-library.jar nel tuo classpath? –

+0

Mentre provo lo stesso esempio, ho ricevuto l'errore, per favore aiuto .. 'C: \ Utenti \ utente1 \ Desktop> java -cp.: Scala-library-2.11.8.jar Test Errore: Impossibile trovare o caricare la classe principale Test' – rinuthomaz

risposta

12

È necessario includere la libreria runtime di Scala per poter utilizzare le classi di Scala. Questa è la causa sia dell'avvertimento del compilatore che dell'errore in fase di esecuzione.

Prova questa

java -cp .:scala-library.jar Test 

(il nome del file jar potrebbe essere diverso, ma il punto è quello di aggiungere al classpath).

+0

Sapeva che sarebbe stato qualcosa di banale. Grazie! – del

+0

come posso aggiungere questa libreria al mio CLASSPATH quando si usa Maven? –

+0

@KevinMeredith: usi Maven per creare o eseguire la tua applicazione? – Thilo

2

Hai inserito scala-library.jar nel classpath? Sembra che tu abbia dimenticato questo, quindi JVM non riesce a trovare alcuna classe interna per il runtime di Scala.

alla LINK http://www.codecommit.com/blog/java/interop-between-java-and-scala:

Just stick scala-library.jar on your classpath and all of your Scala classes should be readily available within your Java application.

Problemi correlati