1. Обзор
В этой статье мы исследуем ошибку « Объявленный пакет не соответствует ожидаемому пакету
» в java-проекте.
Обычно мы рассчитываем поместить наши java-файлы в папки, соответствующие структуре пакета . Наиболее распространенная причина ошибки — когда наша IDE обнаруживает несоответствие между объявлением пакета и физическим расположением файла Java.
В этом кратком руководстве мы рассмотрим пример этой ошибки, как она проявляется в IDE и Maven и как ее устранить. Мы также рассмотрим несколько других советов и приемов.
2. Пример ошибки
Давайте представим, что у нас есть следующий класс в каталоге src/main/java/com/foreach/bookstore
:
package com.foreach;
public class Book {
// fields and methods
}
Мы ожидаем, что это вызовет ошибку в IDE, поскольку имя пакета подразумевает путь src/main/java/com/foreach
.
3. Решение проблемы
Обычно решить эту проблему довольно просто.
3.1. Исправление объявления пакета
Во-первых, давайте удостоверимся, что объявление пакета и относительный путь к исходному файлу совпадают. Если это уже так, мы можем попытаться закрыть и снова открыть проект. Иногда среда IDE может не синхронизироваться с проектом на диске и требует повторного импорта файлов, разрешения зависимостей и успешной перекомпиляции.
В противном случае мы можем исправить объявление пакета в следующем обратном формате DNS:
package com.foreach.bookstore;
3.2. Исправление физического местоположения исходного кода
Возможно, пакет объявлен правильно, а java-файл по ошибке помещен в неправильный каталог.
Затем мы переместим класс Book в следующее правильное расположение каталога:
<source-path>/com/foreach/bookstore
4. Симптомы проблемы
В зависимости от выбранной нами IDE сообщение об ошибке может выглядеть по-разному. Точно так же мы можем увидеть ошибку в maven.
4.1. Ошибка в затмении
В Eclipse мы увидим такую ошибку:
4.2. Ошибка в IntelliJ
В IntelliJ мы получим похожее сообщение об ошибке:
4.3. Ошибка в Мавене
Точно так же мы получим следующую ошибку при запуске сборки maven :
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/saichakr2/foreach-projects/tutorials/core-java-modules/core-java-lang-4/src/main/java/com/foreach/bookstore/Book.java:[3,8] duplicate class: com.foreach.Book
[ERROR] /Users/saichakr2/foreach-projects/tutorials/core-java-modules/core-java-lang-4/src/main/java/com/foreach/bookstore/LibraryAdmin.java:[7,12] cannot access com.foreach.bookstore.Book
bad source file: /Users/saichakr2/foreach-projects/tutorials/core-java-modules/core-java-lang-4/src/main/java/com/foreach/bookstore/Book.java
file does not contain class com.foreach.bookstore.Book
Please remove or make sure it appears in the correct subdirectory of the sourcepath
Однако следует отметить, что класс Book прекрасно скомпилируется с помощью отдельной команды
javac
. Это связано с тем, что компилятор java не требует, чтобы путь объявления пакета и относительный исходный путь совпадали .
5. Ошибка в зависимом коде
Мы можем не обнаружить проблему в самом затронутом файле класса. Он может отображаться в классе с одноранговой зависимостью:
Как и ожидалось, приведенный выше класс не смог разрешить класс Book
, поскольку класс Book
не смог скомпилироваться в ожидаемом пакете.
6. Дополнительные советы и рекомендации
Хотя это легко исправить, когда файл находится по неправильному пути, мы все равно можем столкнуться с трудностями с исходным файлом, который, кажется, находится в правильном месте в дереве исходного кода.
6.1. Проверить путь сборки
Нам нужно убедиться, что путь сборки в IDE не содержит ошибок. Исходный путь по умолчанию упоминается как <project-name>/src/main/java
и <project-name>/src/test/java
. Путь сборки должен иметь правильные зависимости и библиотеку.
6.2. Дополнительный исходный путь
Иногда требуется добавить исходную папку, чтобы maven мог скомпилировать эти файлы классов. Хотя делать это не рекомендуется, так как в большинстве случаев будет достаточно предопределенных исходных папок.
Тем не менее, при необходимости мы можем добавить дополнительные источники с помощью build-helper-maven-plugin:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src/main/<another-src></source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
7. Заключение
В этой статье мы узнали, как несоответствие между объявлением пакета и соответствующим каталогом java-файла вызывает ошибку в IDE. Мы также рассмотрели несколько способов решения этой проблемы.
Как всегда, полный исходный код примеров доступен на GitHub .