11

私は Scala の経験がないので、この質問は初歩的なものかもしれません。このチュートリアルの「Person」の例に基づいて、Java 内から Scala クラスを使用しようとしています。

次のように、Scala と Java の 2 つのソース ファイルを作成します。

Person.scala:

class Person {
  def getName() = "Daniel Spiewak"
}

テスト.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 テスト
スレッド「メイン」の例外 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以上

私が間違っていることは何か分かりますか?

4

2 に答える 2

13

Scala クラスを使用できるようにするには、Scala ランタイム ライブラリを含める必要があります。これが、コンパイラの警告と実行時のエラーの両方の原因です。

これを試して

 java -cp .:scala-library.jar Test

(jar ファイルの名前は異なる場合がありますが、ポイントはそれをクラスパスに追加することです)。

于 2012-10-16T04:26:06.950 に答える
2

クラスパスにscala-library.jarを入れましたか?これを忘れたようですので、JVMはScalaランタイムの内部クラスを見つけることができません。

リンクhttp://www.codecommit.com/blog/java/interop-between-java-and-scala

クラスパスにscala-library.jarを貼り付けるだけで、すべてのScalaクラスがJavaアプリケーション内ですぐに利用できるようになります。

于 2012-10-16T04:28:38.777 に答える