Коллизия пакета eclipse 3.4 (ганимед) с типом
-
28-09-2019 - |
Вопрос
У нас есть пакет, который заканчивается исключением, например.
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), в отличие от рекомендуемого соглашения, плагин все равно будет работать так, как вы задумали.