2012-10-16 14 views
10

Nie mam doświadczenia ze Scala, więc to pytanie może być elementarne. Próbuję użyć klasy Scala z poziomu języka Java, na podstawie przykładu "Person" w tym samouczku: http://www.codecommit.com/blog/java/interop-between-java-and-scalaNoClassDefFoundError przy użyciu klasy Scala z Java

Tworzę dwa pliki źródłowe, jedną Scala i jedną Javę w następujący sposób.

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

mogę skompilować (z ostrzeżeniem, że nie rozumiem), ale pojawia się ClassNotFoundException gdy próbuję uruchomić program.

 
$ 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 

Każdy pomysł, co robię źle?

+0

Bo za wyjątkiem jest [tutaj] (http://javarevisited.blogspot.in/2011/06/noclassdeffounderror-exception-in.html) Czy należy zapoznać – gks

+2

dodajesz scala-library.jar do swojej ścieżki klas? –

+0

Podczas próby tego samego przykładu dostałem poniżej błędu, proszę o pomoc .. 'C: \ Users \ użytkownik1 \ Desktop> java -cp.: Scala-library-2.11.8.jar Test Błąd: Nie można znaleźć lub load main class Test' – rinuthomaz

Odpowiedz

12

Należy włączyć bibliotekę środowiska wykonawczego Scala, aby móc korzystać z klas Scala. Jest to przyczyną zarówno ostrzeżenia kompilatora, jak i błędu w czasie wykonywania.

Spróbuj

java -cp .:scala-library.jar Test 

(nazwa pliku jar może być inna, ale chodzi o to, aby dodać go do ścieżki klasy).

+0

Wiedziałem, że będzie to coś przyziemnego. Dzięki! – del

+0

Jak mogę dodać tę bibliotekę do mojej CLASSPATH podczas korzystania z Maven? –

+0

@KevinMeredith: Czy używasz Mavena do budowania lub uruchamiania aplikacji? – Thilo

2

Czy umieściłeś scala-library.jar w swojej ścieżce klas? Wygląda na to, że zapomniałeś o tym, więc JVM nie może znaleźć wewnętrznej klasy dla środowiska wykonawczego Scala.

W linku 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.

Powiązane problemy