首页 文章

使用Java的Scala类的NoClassDefFoundError

提问于
浏览
11

我没有使用Scala的经验,所以这个问题可能是基本的 . 我试图在Java中使用Scala类,基于本教程中的"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

知道我做错了什么吗?

2 回答

  • 13

    您需要包含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,您的Java应用程序中就可以随时使用所有Scala类 .

相关问题