2016-12-25 68 views
4

我是JVM的新手,所以我很抱歉如果這是一個常見問題。我在OSX上使用Scala(2.12)和sbt 0.13.13。NoClassDefFoundError sbt和scala.swing

我正在研究一個取決於GUI庫scala.swing(2.10.x)的小應用程序。我幾乎立即用示例代碼(http://otfried.org/scala/index_28.html)遇到了運行時問題。

具體來說,調用sbt run當我得到一個堆棧跟蹤與領先:

[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似乎是在斯卡拉STDLIB類/性狀)

閱讀SO和其他地方提出這樣的當編譯時出現的代碼在運行時不能定位時,通常會發出異常。事實上,代碼編譯得很好,只有在運行代碼時纔會出現問題。

我發現的所有建議是協調您的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中的其他小項目沒有任何問題。令人困惑的是,「缺失」類似乎是scala標準庫材料。

+0

如果您試圖在Scala 2.12中使用scala.swing的2.10.x版本,那麼問題可能是因爲版本不兼容。使用2.12版本的'scala.swing' –

+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模塊和相應的版本。斯卡拉2.11之前,鞦韆已出版了這樣一個神器:

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

據然後轉移到org.scala-lang.modules組。構建文件應該包含這樣的事情:

scalaVersion := "2.12.1" 

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

(好像最新的Scala 2.11兼容版本"1.0.2"尚未公佈斯卡拉2.12,所以你需要直"2.0.0-M2"跳應該大部分源兼容) 。

+0

我忽略在我原來的問題中指定我在我的'built.sbt'中爲Scala 2.12指定了正確的擺動分支。 (揮杆指定在2.10+) – cmw

+0

Scala 2.12沒有2.10+是正確的。你正在將它與2.0.x分支混合在一起,我已經爲它提供了上面的工件。 –