Перейти к основному содержимому

Исправление ошибки «Объявленный пакет не соответствует ожидаемому пакету»

· 4 мин. чтения

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 мы увидим такую ошибку:

./68bdb72a96952799a5698b859a1d3614.png

4.2. Ошибка в IntelliJ

В IntelliJ мы получим похожее сообщение об ошибке:

./861b4ae7f747b92c31119e2631270433.png

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. Ошибка в зависимом коде

Мы можем не обнаружить проблему в самом затронутом файле класса. Он может отображаться в классе с одноранговой зависимостью:

./dac1d6d590dbb9743603952fbb1be338.png

Как и ожидалось, приведенный выше класс не смог разрешить класс 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 .