问题 使用Java的Scala类的NoClassDefFoundError


我没有使用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:警告:在'ScalaSignature'类型中找不到注释方法'bytes()':找不到scala.reflect.ScalaSignature的类文件
1警告
$ java测试
线程“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)
        在java.net.URLClassLoader.access $ 100(URLClassLoader.java:71)
        在java.net.URLClassLoader $ 1.run(URLClassLoader.java:361)
        在java.net.URLClassLoader $ 1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        在java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        在Test.main(Test.java:3)
引起:java.lang.ClassNotFoundException:scala.ScalaObject
        在java.net.URLClassLoader $ 1.run(URLClassLoader.java:366)
        在java.net.URLClassLoader $ 1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        在java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ......还有13个

知道我做错了什么吗?


1063
2017-10-16 04:20


起源

异常的原因是 这里  请查阅 - gks
你在类路径中包含了scala-library.jar吗? - Sergey Passichenko
尝试相同的例子我得到以下错误,请帮助.. C:\Users\user1\Desktop>java -cp .:scala-library-2.11.8.jar Test Error: Could not find or load main class Test - rinuthomaz


答案:


您需要包含Scala运行时库才能使用Scala类。这是编译器警告和运行时错误的原因。

尝试这个

 java -cp .:scala-library.jar Test

(jar文件的名称可能不同,但重点是将其添加到类路径中)。


13
2017-10-16 04:26



知道它会是平凡的事情。谢谢! - del
使用Maven时如何将此库添加到CLASSPATH? - Kevin Meredith
@KevinMeredith:您是否使用Maven构建或运行您的应用程序? - Thilo
@Thio我使用Maven - coding_idiot
@Thilo,我得到以下错误, C:\Users\user\Desktop>java -cp .:scala-library-2.11.8.jar Test  Error: Could not find or load main class Test  请指教 - rinuthomaz


你把scala-library.jar放在了你的类路径中吗?好像你忘记了这一点,所以JVM找不到Scala运行时的内部类。

在你的链接中 http://www.codecommit.com/blog/java/interop-between-java-and-scala

只需在您的类路径和所有Scala上粘贴scala-library.jar即可   应该可以在Java应用程序中随时使用这些类。


2
2017-10-16 04:28