NoClassDefFoundError с использованием класса Scala из Java

У меня нет опыта работы с Scala, поэтому этот вопрос может быть элементарным. Я пытаюсь использовать класс Scala из Java, на основе примера "Person" в этом учебнике: http://www.codecommit.com/blog/java/interop-between-java-and-scala

Я создаю два исходных файла, один Scala и один Java, как показано ниже.

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

Я могу скомпилировать (с предупреждением, которое я не понимаю), но при попытке запустить программу я получаю исключение ClassNotFoundException.

$ 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

Любая идея, что я делаю неправильно?

Ответ 1

Вам нужно включить библиотеку времени Scala, чтобы иметь возможность использовать классы Scala. Это является причиной предупреждения компилятора и ошибки во время выполнения.

Попробуйте это

 java -cp .:scala-library.jar Test

(имя файла jar может отличаться, но нужно добавить его в свой путь к классам).

Ответ 2

Вы помещали scala -library.jar в свой путь к классам? Кажется, вы забыли это, поэтому JVM не может найти встроенный класс для Scala времени выполнения.

В вашей ссылке http://www.codecommit.com/blog/java/interop-between-java-and-scala:

Просто вставьте scala -library.jar в свой путь к классам и все ваши Scalaклассы должны быть легко доступны в вашем приложении Java.