2012-10-16 6 views
10

Ich habe keine Erfahrung mit Scala, so dass diese Frage elementar sein kann. Ich versuche, Scala Klasse innerhalb von Java zu verwenden, basierend auf dem "Person" -Beispiel in diesem Tutorial: http://www.codecommit.com/blog/java/interop-between-java-and-scalaNoClassDefFoundError mit Scala-Klasse von Java

Ich erstelle zwei Quelldateien, eine Scala und eine Java, wie folgt.

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

ich kompilieren kann (mit einer Warnung Ich verstehe nicht), aber ich erhalte eine ClassNotFoundException, wenn ich versuche zu laufen das Programm.

 
$ 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 

Irgendeine Idee, was ich falsch mache?

+0

Ursache für die Ausnahme ist [hier] (http://javarevisited.blogspot.in/2011/06/noclassdeffounderror-exception-in.html) lesen Sie bitte – gks

+2

Did Sie enthalten scala-library.jar in Ihrem Klassenpfad? –

+0

Beim Versuch das gleiche Beispiel habe ich unten Fehler, bitte helfen .. 'C: \ Benutzer \ Benutzer1 \ Desktop> Java-cp.: Scala-Bibliothek-2.11.8.jar Test Fehler: Konnte nicht finden oder Last Hauptklasse Test' – rinuthomaz

Antwort

12

Sie müssen die Scala-Laufzeitbibliothek einbeziehen, um Scala-Klassen verwenden zu können. Dies ist der Grund für die Compiler-Warnung und den Fehler zur Laufzeit.

Versuchen Sie, diese

java -cp .:scala-library.jar Test 

(der Name der JAR-Datei anders sein könnte, aber der Punkt ist es zu Ihrem Classpath hinzufügen).

+0

Wusste, es wäre etwas Banales. Vielen Dank! – del

+0

Wie kann ich diese Bibliothek zu meinem CLASSPATH hinzufügen, wenn ich Maven verwende? –

+0

@KevinMeredith: Verwenden Sie Maven zum Erstellen oder Ausführen Ihrer Anwendung? – Thilo

2

Haben Sie scala-library.jar in Ihren Klassenpfad eingegeben? Scheint, dass du dies vergessen hast, also kann JVM keine interne Klasse für die Scala-Laufzeit finden.

In Ihrem 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.