2013-10-09 35 views
1

在scala中,通常的做法是堆棧包語句to allow shorter imports,但是當我使用堆棧包將文件加載到scala IDE中時,我嘗試使用從同一個組織開始的導入,從看起來像是演示編譯器。該代碼在IDE之外的sbt中編譯得很好。爲什麼scala-ide不允許在文件頂部有多個包定義?

的示例代碼片段如下:

package com.coltfred 
package util 
package time 

import com.github.nscala_time.time.Imports._ 

在進口我得到的錯誤object github is not a member of package com.coltfred.util.com

如果我將導入移動到單行,錯誤將消失,但我們在代碼庫中經常使用這種做法,因此將它們全部更改爲單行包語句將會很痛苦。

爲什麼會發生這種情況,有什麼我可以解決的嗎?

編輯:

我用Eclipse的SBT插件生成這個Eclipse項目文件。目錄結構應該是什麼,所有的依賴關係都在類路徑中。

編輯2:

原來有一個在util包(這應該是在同一個包)的測試樹中的文件,但必須在頂部有一個重複的包語句。我沒有檢查測試樹,因爲它不應該影響主樹的編譯,但顯然我錯了。

回答

1

這是一個常見的煩惱,使paulp惱火,試圖修復它。他的想法是不應該把一個不貢獻類文件的目錄作爲一個包裝。如果您可以將util作爲scala.util,那麼您應該優先選擇foo.util,其中util是空的。

util dir是通常的嫌疑犯,因爲誰沒有一個util dir躺在,特別是,./util

[email protected]:~/tmp/coltfred$ mkdir -p com/coltfred/util/time 
[email protected]:~/tmp/coltfred$ mkdir -p com/coltfred/util/com 
[email protected]:~/tmp/coltfred$ vi com/coltfred/util/time/test.scala 
[email protected]:~/tmp/coltfred$ scalac com/coltfred/util/time/test.scala 
./com/coltfred/util/time/test.scala:5: error: object github is not a member of package com.coltfred.util.com 
import com.github.nscala_time.time._ 
     ^
one error found 
[email protected]:~/tmp/coltfred$ cat com/coltfred/util/time/test.scala 
package com.coltfred 
package util 
package time 

import com.github.nscala_time.time._ 

class Test 

[email protected]:~/tmp/coltfred$ 

要進行調試,請找出從哪裏獲取有問題的軟件包。

+0

我打電話給我的目錄pUtil。我在我的所有包名稱的開頭總是使用'​​p'。 –

+0

看到我的第二次編輯。這不是一個目錄,而是一個糟糕的測試文件。 – coltfred

+0

我選擇這個作爲「正確」的答案,因爲它是問題的根源,但要小心未來的人們也要考慮測試文件! – coltfred

3

不知道爲什麼Scala的IDE不喜歡這一點,但你可以強制導入在使用_root_頂層開始:

import _root_.com.github.nscala_time.time.Imports._ 

看看是否能避免刺激性的IDE。

+0

+1也適用於我們 – maasg

+0

當然你可以這樣做,但問題的焦點集中在爲什麼IDE的演示編譯器要求提供正常編譯器不需要的寶貝。 –

+0

我正在提供一個解決問題的方法,重點在於:「我有什麼可以解決的嗎?」這沒有用嗎? – Shadowlands

相關問題