NoClassDefFoundError 使用 Java 中的 Scala 类

Posted

技术标签:

【中文标题】NoClassDefFoundError 使用 Java 中的 Scala 类【英文标题】:NoClassDefFoundError using Scala class from Java 【发布时间】:2012-10-06 03:02:10 【问题描述】:

我没有使用 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 测试.java ./Person.class:警告:在“ScalaSignature”类型中找不到注释方法“bytes()”:未找到 scala.reflect.ScalaSignature 的类文件 1 个警告 $ java 测试 线程“主”java.lang.NoClassDefFoundError 中的异常:scala/ScalaObject 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:787) 在 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在 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) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:423) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 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) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:423) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:356) ... 13 更多

知道我做错了什么吗?

【问题讨论】:

异常原因是here请查看 您是否在类路径中包含了 scala-library.jar? 在尝试相同的示例时,我得到了以下错误,请帮助.. C:\Users\user1\Desktop>java -cp .:scala-library-2.11.8.jar Test Error: Could not find or load main class Test 【参考方案1】:

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

试试这个

 java -cp .:scala-library.jar Test

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

【讨论】:

知道这将是平凡的事情。谢谢! 如何在使用 Maven 时将此库添加到我的 CLASSPATH 中? @KevinMeredith:您使用 Maven 构建或运行您的应用程序吗? @Thio 我两者都使用 Maven @Thilo ,我遇到错误,C:\Users\user\Desktop>java -cp .:scala-library-2.11.8.jar Test Error: Could not find or load main class Test 请告知【参考方案2】:

您是否将 scala-library.jar 放入您的类路径中?看来你忘了这一点,所以 JVM 找不到 Scala 运行时的内部类。

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

只需将 scala-library.jar 粘贴到您的类路径和所有 Scala 中 类应该在您的 Java 应用程序中随时可用。

【讨论】:

以上是关于NoClassDefFoundError 使用 Java 中的 Scala 类的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/JsonDeserializer

NoClassDefFoundError PlexusIoResourceCollection / Jenkins + Maven 3

HttpClient NoClassDefFoundError

ConfigServletWebServerApplicationContext: 嵌套异常是 java.lang.NoClassDefFoundError: jakarta/servlet/jsp/

NoClassDefFoundError:android.support.v7.internal.view.menu.MenuBuilder

NoClassDefFoundError:android.support.v7.internal.view.menu.MenuBuilder