2011-12-15 10 views
9

RemoteActorsで小さなアプリケーションがあり、そこからjarファイルを作成したいとします。私はそれを実行しようとすると、それは、この例外を取得します。Scala jarファイルを実行しているときにNoClassDefFoundError

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.lang.NoClassDefFoundError: scala/actors/Combinators 
    at pingpong.PingApp$.main(PingApp.scala:5) 
    at pingpong.PingApp.main(PingApp.scala) 
    at pingpong.ScalaEntryPoint.main(ScalaEntryPoint.java:5) 
    ... 5 more 
Caused by: java.lang.ClassNotFoundException: scala.actors.Combinators 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    ... 8 more 

私は私のjarファイルにScalaの-library.jarが含まれている、それがクラスパスにあります。さもなければjavaはクラスScalaObjectを見つけるのを止めるでしょう。

+0

ランタイム情報はもっと良いでしょう。 Mavenでjarファイルを作成しようとしていますか?それとも、Eclipseで動かすだけですか? – hellectronic

+1

少なくとも、あなたが起動したコマンドラインを表示し、使用しているScalaのバージョンを記述してください。 – retronym

+0

コマンド:java -jar myjar.jar 私はスカラー2.7.7を使用しています最終 – laci37

答えて

1

問題は、Eclipse上のScalaプラグインとインストールされているScalaバージョンのバージョンが一致しないことでした。 actors/Combinators.scalaは2.8で、Eclipseプラグインは2.8でしたが、2.7.7 scala-library.jarが含まれています

4

Javaは「jar内のjar」を処理しません。デフォルトのクラスローダーはそうしたクラスをロードできません。

eclipseのexport-> java-> runnable jarをスタックトレースとして使用したようです。 jarのロード時にjarを処理する特別なクラスローダーをインクルードすることになっていますが、動作していないようです。

私は、何かが瓶を作るのが間違っていたと思うか、あなたの瓶とクラスパスの両方にスカラが含まれていると混乱します。 "ライブラリをjarにパッケージ化する"ではなく、 "jarにライブラリを展開する"を使ってこの方法をやり直すこともできます。あなたはクラスパスでスカラーなしでそれを試すことができます。

他のオプションを使用すると、単一の出荷可能なjarファイルたい場合があることに失敗:

  • をあなたは、あなたが依存jarファイルのすべてを解凍して、コンパイルされたクラスでそれらを再梱包することができます(「抽出」するものでなければなりません上記)。 Mavenのshadeプラグインがこれを助けることができます。

  • あなたは希望は、これはあなたがより多くの助けが必要な場合は、あなたの手順を正確に何を記述する必要があり、便利ですOneJar

のように、ネストされたjarファイルを読み込むことができますクラスローダの実装を提供します別のソリューションを使用することができますこのjarを生成するために取ると、おそらく "jar tvf myjar.jar"の出力も役立ちます。

+0

jarファイルにscalaライブラリを抽出しようとしましたが、結果は同じ例外です。 scala-library.jarにscala.actors.Combinatorsクラスがないようです。 – laci37

+0

"jar tvf myjar.jar"を実行してscala-langがそこにあることを確認できますか?その場合は、(jar xvf)myjar.jarを一時フォルダに展開し、同じ方法で存在するscala-lang.jarを検査しますか? –

+0

jar tvf ping.jar | grep scala-langは結果を表示しません。私は瓶を抜き出し、scala-langという名前のファイルは見つけられませんでした。 – laci37

関連する問題