1. 概述

在这篇文章中,我们将探讨Java项目中出现的“声明的包与预期包不匹配”错误。通常,我们期望将Java文件放在与包结构相对应的文件夹中。最常见的原因是IDE在遇到包声明和Java文件实际位置不匹配时出现的错误。

在这篇简短教程中,我们将通过一个示例来了解这种错误,它在IDE和Maven中如何显示,以及如何解决。我们还将探讨一些其他技巧和窍门。

2. 错误示例

假设我们在src/main/java/com/baeldung/bookstore目录下有一个类:

package com.baeldung;

public class Book {
    // fields and methods
}

这可能会在IDE中引发错误,因为包名暗示了路径src/main/java/com/baeldung

3. 解决问题

通常,这个问题的解决相当直接。

3.1. 更正包声明

首先,确保包声明和相对源文件路径匹配。如果已经是这样,我们可以尝试关闭并重新打开项目。有时,IDE可能与磁盘上的项目同步不一致,需要重新导入文件、解决依赖并成功重新编译。

否则,我们可以按照反DNS格式修正包声明:

package com.baeldung.bookstore;

3.2. 更正源代码的实际位置

可能是包声明正确,但Java文件被误放入了错误的目录。

然后,我们将Book类移动到以下正确的目录位置:

<source-path>/com/baeldung/bookstore

4. 问题症状

根据我们的首选IDE,错误消息可能会有所不同。同样,我们可能会在Maven中看到错误。

4.1. Eclipse中的错误

在Eclipse中,我们会看到类似这样的错误:

1. 2021年8月5日 AM 12:02的屏幕截图

4.2. IntelliJ中的错误

IntelliJ中,我们也会收到类似的错误信息:

2. 2021年8月3日 PM 11:36的屏幕截图

4.3. Maven中的错误

同样,在运行Maven构建时(/maven),我们可能会看到以下错误:

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /Users/saichakr2/baeldung-projects/tutorials/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/bookstore/Book.java:[3,8] duplicate class: com.baeldung.Book
[ERROR] /Users/saichakr2/baeldung-projects/tutorials/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/bookstore/LibraryAdmin.java:[7,12] cannot access com.baeldung.bookstore.Book
  bad source file: /Users/saichakr2/baeldung-projects/tutorials/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/bookstore/Book.java
    file does not contain class com.baeldung.bookstore.Book
    Please remove or make sure it appears in the correct subdirectory of the sourcepath

然而,需要注意的是,使用单独的javac命令编译Book类时,该类会正常编译。这是因为Java编译器不需要包声明路径和相对源路径匹配

5. 依赖代码中的错误

我们可能不会在受影响的类文件本身中发现这个问题。它可能会出现在具有同级依赖的类中:

3. 2021年8月4日上午10:46的屏幕截图

如预期,上述类无法解析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上找到。