2013-06-02 437 views
35

我有一個scala項目,編譯,運行和測試從命令行使用SBT罰款。但是,建設的IntelliJ項目時,似乎在項目中的每個類都有在事件日誌中這個錯誤,導致生成失敗:Intellij編譯失敗:「已經定義爲」

SendCommandToService is already defined as case class SendCommandToService 
case class SendCommandToService(service: String, commandName: String, keys: Array[String], values: Array[String]) 
    ^
+0

您是否嘗試過構建 - >重建項目? – drexin

+0

是的,我試過了。不過謝謝。 – Nick

回答

21

這意味着有兩個編譯的類具有相同的包和類名在你的classpath中找到。一個由sbt編譯,一個由IntelliJ編譯。

以下情況之一應該能夠解決這個問題:

  1. 嘗試生成的IntelliJ .iml直接sbt-idea而不是導入文件。
  2. SBT點擊構建之前乾淨 - 在的IntelliJ
  3. >重建與重建的IntelliJ時,請確保SBT沒有運行
+0

在IntelliJ之外使用SBT和Play,upvoted for「sbt clean」,這對我來說終於成功了(雖然我曾經降級過Scala 2.11-> 2.10.4)。 –

+0

@JohnLockwood我仍然有這個問題,我已經禁用了緩存,做'sbt clean','sbt compile',但是,我的簡單腳本正在接收一個「已經被定義爲對象」..我甚至重命名了對象和我的IntellIJ仍然讓我選擇運行前一個對象。 – ypriverol

1

我都內的思想沒有過類似的問題不斷出現:普通SBT。

原來在子目錄CVS /基地,這顯然SBT試圖編譯一些* .scala文件CVS商店副本。當我刪除CVS子目錄時,問題就消失了。

4

我有同樣的問題,@Max是正確的,與編譯的類存在衝突,但提供的解決方案對我無效。事實證明,我正在使用sbt-idea來生成IDEA項目結構,作爲SBT導入中的Intellij IDEA 14 + scala plugin bug的解決方法,這在我編寫此代碼時尚未修復。

爲了解決這個問題,我不得不刪除src_managed/main/controller,因爲sbt-idea bug模塊設置中與src_managed/main衝突。因此,請仔細檢查您的模塊源文件夾,並確保您沒有與已聲明爲源的父文件夾衝突的子文件夾。

74

對我來說,原因是myproject/srcmyproject/src/main/scala被標記爲源。因此,由於上述錯誤,intellij未能建立myproject/src/main/scala。取消標記來源myproject/src(在intellij中,文件 - >項目結構,選擇myproject模塊,在Sources選項卡中選擇src文件夾,從「添加內容根目錄」窗格中的Source中移除它)解決了問題。希望這可以幫助。

+0

是的,這發生在我在Scala + Java混合項目中。 – expert

+0

當我將項目從'src'移動到'src/main/scala'時發生了這種情況。 –

+0

我有這個問題,因爲我已經在SBT中定義了一個生成源的任務; IntelliJ不知道在編譯期間是否運行這個函數,或者是生成的代碼在target/scala-2.11/src_managed下,所以我不得不手動添加它作爲源路徑,並且這樣做會導致錯誤地標記父母和子文件夾作爲源,如上所述。 – Luciano

0

在我的情況下,問題是protobuf的理念插件

  1. 取出想法protbuf插件。
  2. 關閉理念
  3. 再刪除該項目與想法(.idea和.idea_modules)相關的所有文件夾
  4. 開放思想和導入。
0

後SBT編譯我不得不把文件夾生成的源標記根,因爲我需要這些文件進行編譯。

0

您需要將「設置 - >構建,執行,部署 - > Scala編譯器 - >編譯順序」從「混合」更改爲「Java然後Scala」。 如果你以前編譯過這個項目,你應該先運行「sbt clean」。