- 締切済み
javaでscalaのクラスを使う
Scala初心者です^^ Scalaで作ったクラスをJavaで使おうとしています. しかしなかなかうまくいかなくて… ソースを下に書いておきます. [ap/hello.scala] class hello(str2: String){ val str = str2 def say(){ println(str) } } [ap/start.java] public class start{ public static void main(String[] args){ hello h = new hello("Hello!"); h.say(); } } helloクラスのコンストラクタを用いて指定した文字列を helloクラスのsayメソッドで標準出力するだけの簡単なクラスなのですが, うまく実行できず… Exception in thread "main" java.lang.NoClassDefFoundError: ap/start/class Caused by: java.lang.ClassNotFoundException: ap.start.class at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Kazus-MackBookPro:ScalaLearning macuser$ java ap/start Exception in thread "main" java.lang.NoClassDefFoundError: ap/start (wrong name: start) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) というエラーが出てしまいます. どこが悪いかわかる方いらっしゃいませんか? それとも,JavaではScalaで作った.classファイルは使うことができないのでしょうか? Scalaはまだ覚えて2週間なので,まだ完全に理解できていません>< よろしくお願いします
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- askaaska
- ベストアンサー率35% (1455/4149)
質問で提示した例外は $java ap.start のときの例外ね。 これでいけるんじゃないかしら $cd ap $java start
- askaaska
- ベストアンサー率35% (1455/4149)
NoClassDefFoundError つまり、 クラスが見つかりませんよ ってこと。 実行時にクラスパスから抜けているんじゃない?
補足
実行の方法は… $scalac hello.scala として,apフォルダ内にhello.classができたのを確認してから… $javac start.java として,start.javaをコンパイルしています. 実行は $java start (又は, $java ap.start) と実行しています. hello.classもstart.classも同じapフォルダ内に入っているので,javaの感覚なら 正しく動作するのかな?と思っていたのですが, やはり上のエラーが出てしまいます. この方法は間違っているのでしょうか?間違っていなければ, ほかにどこを疑えばいいのでしょうか? ちなみに,hello.classは $scala でscalaを立ち上げて > val h = new hello("Hello!") ~~~ > h.say() Hello! とすれば,正しく動作します.
補足
たびたびの回答ありがとうございます. $java ap.startでも$java start(もちろん$cd apの後)でも 同じエラーになってしまうようです><