2016-12-25 3 views
4

これは一般的な問題である場合は私は謝罪するので、私はJVMの土地に新しいです。私は、OSXでsbt 0.13.13でScala(2.12)を使用しています。NoClassDefFoundError with sbtとscala.swing

私はGUIライブラリscala.swing(2.10.x)に依存する小さなアプリケーションを開発しています。私はすぐにランタイムの問題に遭遇し、サンプルコード(http://otfried.org/scala/index_28.html)で直ちに実行しました。

[error] (run-main-0) java.lang.NoClassDefFoundError: scala/Proxy$class 
java.lang.NoClassDefFoundError: scala/Proxy$class 
    at scala.swing.Window.<init>(Window.scala:25) 
    at scala.swing.Frame.<init>(RichWindow.scala:75) 
    at scala.swing.MainFrame.<init>(MainFrame.scala:19) 

Proxyは、ScalaのSTDLIBでクラス/トレイトのように見える)

SOおよび他の場所で読んで、この種のことを示唆している:私は主要なスタックトレースを取得しsbt runを起動すると、具体的に

、コンパイル時に存在するコードを実行時に後で見つけることができない場合、例外が発生します。確かに、コードはうまくコンパイルされますが、問題が発生したコードを実行しているときだけです。

私が見つけたすべての提案は、これらの問題を解決するためにclasspathを調整することです。 sbtコンソールが信じにある場合は、私のコンパイル時と実行時にクラスパスが同一である:だから

> show compile:fullClasspath 
[info] * Attributed(/Users/chris/Projects/thing2/target/scala-2.12/classes) 
[info] * Attributed(/Users/chris/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.1.jar) 
[info] * Attributed(/Users/chris/.ivy2/cache/org.scala-lang/scala-swing/jars/scala-swing-2.10.6.jar) 
[success] Total time: 0 s, completed Dec 24, 2016 7:01:15 PM 
> show runtime:fullClasspath 
[info] * Attributed(/Users/chris/Projects/thing2/target/scala-2.12/classes) 
[info] * Attributed(/Users/chris/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.12.1.jar) 
[info] * Attributed(/Users/chris/.ivy2/cache/org.scala-lang/scala-swing/jars/scala-swing-2.10.6.jar) 
[success] Total time: 0 s, completed Dec 24, 2016 7:01:19 PM 

、私は法医学行き詰まりのビットで自分自身を見つけます。次に見たいところについては、何か提案をいただければ幸いです。わかりやすくするために、これまでのところscala.swingが発生しています。 Scalaには問題のない小さなプロジェクトがいくつかあります。困ったことは、 "欠けている"クラスはスカラーの標準ライブラリのようです。

+0

Scala 2.12で 'scala.swing'の2.10.xバージョンを使用しようとすると、互換性のないバージョンが原因である可能性があります。 'scala.swing'の2.12バージョンを使用してください –

+0

ほとんどのScalaライブラリは、後方互換性も前方互換性もありません。 –

+1

2.10.xは' scala.swing'の内部バージョン化を参照していると思います。 https://github.com/scala/scala-swingにあるドキュメントは、swing 2.xブランチがscala用に正しいものであることを示しています。2.12 – cmw

答えて

7

NoClassDefFoundErrorは、異なる主要なScalaバージョン用にコンパイルされたライブラリを混在させる問題を指摘しています。 Scala 2.12を使用する場合は、Swingモジュールとバージョンが一致するものも使用する必要があります。 Scalaの2.11の前に、Swingはこのようなアーティファクトで公開されています:

"org.scala-lang" % "scala-swing" % scalaVersion.value 

それを次にorg.scala-lang.modulesグループに移動されました。 (最新のScala 2.11互換性のあるバージョン"1.0.2"はScalaの2.12のために公開されていない、ので、あなたは主に互換性のあるソースすべきストレート"2.0.0-M2"にジャンプする必要があると思われる)

scalaVersion := "2.12.1" 

libraryDependencies += "org.scala-lang.modules" %% "scala-swing" % "2.0.0-M2" 

:あなたのビルドファイルはこのようなものが含まれている必要があります。

+0

私は私のオリジナルの質問で私がScala 2.12用の私の 'built.sbt'で正しいswingブランチを指定してください。 (2.10 +で指定されたスイング) – cmw

+0

Scala 2.12には2.10+はありません。私は上記のアーティファクトを与えた2.0.xブランチでそれを混ぜています。 –