Вопрос

У нас есть пакет, который заканчивается исключением, например.

package a.b.c.exception;

В нашей кодовой базе не было проблем до eclipse 3.3, однако, когда мы перешли на eclipse 3.4, начались ошибки, связанные с этим пакетом:

"The package a.b.c.exception collides with a type"

Когда я реорганизую имя пакета в исключения a.b.c., проблем не возникнет.Это из-за ошибки в eclipse 3.4 или есть какие-то настройки, позволяющие исправить это поведение?

Это было полезно?

Решение 5

Я изменил один из вариантов компиляции в eclipse, и проблема исчезла.В свойствах рабочей области:Java Compiler -> Ошибки/Предупреждения -> Изменить «неиспользованный импорт» от «предупреждения», чтобы «игнорировать».

Другие советы

Это потому, что у вас есть класс с именем exception (с маленькой буквы «е») в a.b.c пакет и пакет с именем a.b.c.exception.

Это вызывает конфликт имен, потому что если у вас есть код a.b.c.exception.doSomething(); - означает ли это, что вы хотите вызвать статический doSomething() метод в a.b.c.exception сорт?Или это означает, что есть класс под названием a.b.c.exception.doSomething конструктор которого вы пытаетесь вызвать?

Придерживайтесь соглашений об именах Java - все пакеты должны быть в нижнем регистре, классы начинаются с заглавных букв, а после них - верблюжий регистр - и вы никогда не столкнетесь с этой проблемой.

==========РЕДАКТИРОВАТЬ==========

Это единственный законный почему эта ошибка должна появиться...

Он не обязательно должен быть непосредственно в вашем проекте, он может быть в другом проекте или библиотеке, от которой зависит ваш проект.Это должно показать вам любые вхождения класса в любом месте пути сборки или вашего проекта:Нажмите кнопку «Фонарик» на панели инструментов Eclipse -> выберите «Поиск Java» -> введите исключение a.b.c. в поле поиска -> выберите «С учетом регистра» -> выберите «Тип» в «Поиск» -> убедитесь, что выбраны все параметры. для «Искать в».

Используете ли вы какие-либо инструменты для создания классов?Могут ли они поместить их в каталог сборки вашего проекта?Когда вы видите ошибку, если вы перейдете в каталог сборки проекта и спуститесь в каталог a/b/c/, увидите ли вы файл .class для «исключения»?

Конечно, в Eclipse в целом может быть ошибка (хотя я ожидаю, что в Eclipse 3.4 будет отчет об ошибке, и вы сможете найти больше жалоб, если это так...), ваша установка Eclipse может быть сломана в некоторых случаях. (Может ли кто-нибудь еще открыть ваш проект в Eclipse 3.4?Не могли бы вы выполнить чистую установку Eclipse 3.4 в другой каталог?Появляется ли там ошибка?), или ваш проект может быть каким-то образом испорчен (создайте новый проект без каких-либо зависимостей, кроме JDK, создайте пакет исключений abc в своем новом проекте, создайте в своем проекте класс для import a.b.c.exception.*; и посмотрите, возникает ли ошибка.).

В Java не может быть имени класса, совпадающего с именем пакета.

Это означает, что пакет JDT должен обеспечить соблюдение этого правила только в версии 3.4.

Видеть ошибка 63668 например.


Как комментирует Нейт:

Класс с именем Exception не помешает вам создать исключение пакета..
Дело имеет значение.

Также помните, что полное имя класса включает пакет, в котором он находится.
Так a.b.SomeClass (имя класса) отличается от x.y.SomeClass (имя пакета).
Здесь не было бы конфликта имен.

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

Видеть его более точный ответ.

Я столкнулся с похожей проблемой в огромной базе кода, которую я унаследовал.Оказывается, конфликт был вызван частично определенным именем класса в ссылке JavaDoc.

Перефразируя, Eclipse сообщил мне, что у меня конфликт пакетов/типов для a.b.c.d.при составлении abcdLondon.Выполнение Java-поиска по коду abcd показало, что Eclipse считает, что комментарий JavaDoc в a.b.c.Paris соответствует.Комментарий JavaDoc содержал {@ link d.NewYork}.Когда я изменил его на {@link a.b.c.d.NewYork}, ошибка компиляции была устранена.

Следует также отметить, что NewYork не был импортирован в класс Paris, поскольку он появился только в комментарии JavaDoc.Это также делало его неразрешенным в сокращенном виде и переход по ссылке в комментарии не работал.Если сделать его абсолютной ссылкой, ссылка JavaDoc также будет работать.

Я знаю, что это прозвучит глупо и, возможно, слишком просто, чтобы быть правдой, но я решил точно такое же сообщение об ошибке:

  • Удаление всей строки имени пакета, вызывающей сообщение об ошибке.
  • Сохранение файла .java (это вызывает новую ошибку в той же строке с надписью «Объявленный пакет «не соответствует ожидаемому пакету»), что и должно быть сделано.
  • Повторный ввод исходного имени пакета в ту же строку.
  • Сохранение файла .java.

Не могу сказать, почему это сработало, но это сработало, и Eclipse тут же перестал устраивать истерику.

Безопасный набор текста и быстрое кодирование.

-Гудж

Если у вас есть класс Foo, у вас не может быть пакета, оканчивающегося на Foo, например com.my.Foo.
Кроме того, если вы используете стиль maven, в вашем проекте есть ресурсы, например, src/main/resources.
Папки в ваших ресурсах также имеют стиль пакета, и там также не может быть папки, содержащей имя вашего класса.

вы обязательно столкнетесь с этой проблемой при разработке плагина Jenkins в соответствии с рекомендуемыми соглашениями.
Если вы следуете соглашениям Jenkins и создаете построитель в классе с именем MyBuilder в пакете x.y, то вы также должны поместить свой .jelly в папку ресурсов с именем x.y.MyBuilder.Это приведет к вышеуказанной проблеме.
Однако, если вы назовете свою папку ресурсов x.y.myBuilder (обратите внимание на строчную букву «m» в myBuilder), в отличие от рекомендуемого соглашения, плагин все равно будет работать так, как вы задумали.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top