我对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
知道我做错了吗?
答案 0 :(得分:13)
您需要包含Scala运行时库才能使用Scala类。这是编译器警告和运行时错误的原因。
试试这个
java -cp .:scala-library.jar Test
(jar文件的名称可能不同,但重点是将其添加到类路径中。)
答案 1 :(得分:2)
你是否在你的类路径中放了scala-library.jar?好像你忘记了这一点,所以JVM找不到Scala运行时的内部类。
在您的链接http://www.codecommit.com/blog/java/interop-between-java-and-scala中:
将scala-library.jar粘贴在类路径和所有Scala上 应该可以在Java应用程序中随时使用这些类。