2013-10-09 2 views
1

스칼라에서는 패키지 문 to allow shorter imports을 스택하는 것이 일반적이지만 스태킹 된 패키지를 사용하여 파일을로드 할 때 동일한 조직으로 시작하는 가져 오기를 사용하려고하면 컴파일러 오류가 발생합니다. 프리젠 테이션 컴파일러. 코드는 IDE 외부의 sbt에서 정상적으로 컴파일됩니다. 내가 오류 object github is not a member of package com.coltfred.util.com를 얻을 수 가져 오기에scala-ide가 파일 위쪽에 여러 패키지 정의를 허용하지 않는 이유는 무엇입니까?

package com.coltfred 
package util 
package time 

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

다음과 같이

예제 코드입니다.

가져 오기를 한 줄로 옮기면 오류가 사라지 겠지만 코드 기반에서이 연습을 자주 사용 했으므로 한 줄로 된 패키지 문으로 모두 변경하면 문제가됩니다.

왜 이런 일이 발생하며이를 해결하기 위해 할 수있는 일이 있습니까?

편집 :

내가 이것에 대한 Eclipse 프로젝트 파일을 생성 일식-SBT 플러그인을 사용했다. 디렉토리 구조는 있어야하며 모든 종속성이 클래스 경로에 있습니다.

편집 2 :

이있다 (같은 패키지에 있었어야)이 폴더의 유틸리티 패키지의 테스트 트리에서 파일을했지만, 상단에 중복 패키지 문을했다 밝혀졌습니다. 테스트 트리를 확인하지 않았으므로 주 트리의 컴파일에 영향을 미치지 않아야하지만 분명히 틀 렸습니다.

답변

1

이 문제를 해결하기 위해 펄럭 거리는 것은 일반적인 성가심입니다. 그의 생각은 클래스 파일을 제공하지 않는 dir을 패키지로 사용해서는 안된다는 것입니다. utilscala.util으로 사용할 수있는 경우 util이 비어있는 foo.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

내 두 번째 편집을 참조하십시오. 그것은 dir이 아니라 잘못된 테스트 파일입니다. – coltfred

+0

문제의 근원에 있기 때문에 이것을 "올바른"대답으로 선택했지만, 미래의 사람들에게도 테스트 파일을 고려해야합니다! – coltfred

3

스칼라 IDE이를 좋아하는 것이 아니라, 당신이 _root_를 사용하여 최상위 수준에 시작하는 가져 오기를 강제 할 수있는 이유 확실하지 : 그 IDE를 자극 피할 경우

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

참조.

+0

+1 – maasg

+0

물론 가능하지만 IDE의 프리젠 테이션 컴파일러에서 일반 컴파일러가 필요로하지 않는 이유가 무엇인지에 초점을 맞추고 있습니다. –

+0

"나는 문제를 해결하기 위해 할 수있는 일이 있습니까?" 유용하지 않나요? – Shadowlands