Почему scala-ide не позволяет определять несколько пакетов в начале файла?

В scala обычной практикой является объединение операторов пакетов , чтобы разрешить более короткий импорт, но когда я загружаю файл с помощью сложенные пакеты в scala ide, и я пытаюсь использовать импорт, начиная с той же организации, я получаю ошибку компилятора от того, что кажется компилятором презентации. Код отлично компилируется в sbt вне 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 был файл (который должен был быть в том же пакете), но в верхней части имелся повторяющийся оператор пакета. Я не проверял тестовое дерево, потому что оно не должно влиять на компиляцию основного дерева, но видимо ошибся.


person coltfred    schedule 09.10.2013    source источник


Ответы (2)


Это обычное раздражение, которое разозлило Пола, и он попытался это исправить. Его идея заключалась в том, что каталог, в котором нет файлов классов, не следует воспринимать как пакет. Если вы можете принять util за scala.util, вы должны сделать это вместо foo.util, где эта утилита пуста.

Обычно подозревается каталог util, потому что у кого не завалялся каталог util, и в частности ./util?

apm@mara:~/tmp/coltfred$ mkdir -p com/coltfred/util/time
apm@mara:~/tmp/coltfred$ mkdir -p com/coltfred/util/com
apm@mara:~/tmp/coltfred$ vi com/coltfred/util/time/test.scala
apm@mara:~/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
apm@mara:~/tmp/coltfred$ cat com/coltfred/util/time/test.scala
package com.coltfred
package util
package time

import com.github.nscala_time.time._

class Test

apm@mara:~/tmp/coltfred$ 

Чтобы отладить, узнайте, откуда загружается проблемный пакет.

person som-snytt    schedule 10.10.2013
comment
Я называю свой каталог pUtil. Я всегда использую «p» в начале всех имен моих пакетов. - person Rich Oliver; 10.10.2013
comment
Я выбрал это как правильный ответ, потому что он лежит в основе проблемы, но будьте осторожны, будущие люди, что тестовые файлы также принимаются во внимание! - person coltfred; 10.10.2013
comment
@coltfred Это хорошо. Раньше я держал тесты в отдельном проекте eclipse. С сферами sbt или maven меньше проблем. - person som-snytt; 11.10.2013

Не уверен, почему Scala IDE это не нравится, но вы можете заставить импорт начинаться на верхнем уровне, используя _root_:

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

Посмотрите, не раздражает ли это среду IDE.

person Shadowlands    schedule 09.10.2013
comment
Конечно, вы могли бы это сделать, но вопрос сосредоточен на том, почему компилятор представления IDE требует ухода, которого нет у обычного компилятора. - person Leif Wickland; 10.10.2013
comment
Я предлагаю обходной путь к той части вопроса, которая сосредоточена на следующем: могу ли я что-нибудь сделать, чтобы это исправить? Разве это не полезно? - person Shadowlands; 10.10.2013
comment
Ваше предложение действительно решает мою проблему. Я действительно хотел бы найти способ исправить это без изменения кода, поскольку кажется глупым вставлять хлам только для того, чтобы присматривать за затмением. - person coltfred; 10.10.2013
comment
Извините @shadowlands. Мое неправильно направленное раздражение связано с неисправностью IDE, а не с вашим полезным обходным путем. - person Leif Wickland; 10.10.2013
comment
@LeifWickland Это круто. Мне было бы любопытно, почему это тоже ломается, хотя я сам не использую Scala IDE. - person Shadowlands; 10.10.2013
comment
@coltfred Не могли бы вы подать заявку в системе отслеживания ошибок Scala IDE . Пожалуйста, не забудьте предоставить автономный пример, который можно использовать для воспроизведения проблемы. На самом деле, мы сами используем вложенные пакеты (также в кодовой базе Scala IDE), но мы никогда не сталкивались с проблемой, о которой вы здесь сообщили. Я пытался воспроизвести проблему, но мне не повезло. Кроме того, в следующий раз, если у вас возникнут проблемы с Scala IDE, я предлагаю вам обратиться к scala-ide-user ML. - person Mirco Dotta; 10.10.2013
comment
Кажется, у вас есть каталог com внутри утилиты (как говорится в сообщении об ошибке). Вложенный импорт работает так. Этот каталог com может находиться либо в целевом каталоге, либо в исходной папке. Я предполагаю, что он у вас есть в исходной папке, а Sbt не устанавливает исходный путь. - person Iulian Dragos; 10.10.2013