【持续更新】踩坑记录

【持续更新】踩坑记录

1-项目主模块编译报错-250915

【描述】

使用Maven编译项目主模块时出现错误。Maven->项目主模块->生存期->compile

1
2
3
4
5
6
7
8
9
10
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project sky-common: Fatal error compiling: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid' -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :sky-common

【分析】

NoSuchFieldErrorJCTree$JCImport

错误的核心是:

1
java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
  • com.sun.tools.javac.tree.JCTree: 这个类属于 javac(Java 编译器)的内部 API。普通应用程序代码绝不会、也不应该直接引用或操作这些类。
  • 谁会使用这些内部 API?: 主要是那些需要在编译期修改或生成代码的工具,也就是 注解处理器(Annotation Processor)
  • JCImport: 这个类具体代表了代码中的 import 语句。一个需要修改或分析 import 语句的注解处理器,最著名的就是 Lombok。Lombok 在编译时会解析你的源代码(例如看到 @Getter 注解),然后修改抽象语法树(AST),为你的类添加新的方法和字段。在这个过程中,它很可能需要操作 import 语句(例如,自动添加某些依赖的 import)。

【结论】

版本不匹配

NoSuchFieldError 意味着:一个类被成功加载了(所以 Lombok 和编译器都在类路径上),但这个类在运行时并不包含代码试图访问的特定字段(qualid)。

这几乎总是因为:
编译 Lombok 库时所用的 JDK 版本,与你当前项目编译时使用的 JDK 版本不一致。

  • Sun/Oracle 明确声明 com.sun.tools.javac 下的类是内部 API,不保证稳定性
  • 不同主要版本的 JDK(如 8, 11, 17, 21)之间,这些内部 API 经常会发生改动。一个字段可能被重命名、移除或改变类型。
  • 如果你用一个为 JDK 8 编译的旧版 Lombok(它期望 JCImport 有一个叫 qualid 的字段),却把它用在 JDK 17 上(可能这个字段已经被改名为 qualifier 或者用其他方式重构了),那么当 Lombok 试图访问旧的 qualid 字段时,JVM 就会抛出这个 NoSuchFieldError

【总结】

虽然其他注解处理器也可能导致类似问题,但 Lombok 是迄今为止最流行、最常遇到此问题的库。其诊断过程可以概括为:

  1. 看到涉及 javac 内部 API 的 NoSuchFieldError/NoSuchMethodError -> 立即怀疑是注解处理器。
  2. 项目是否使用了 Lombok? -> 绝大多数情况下答案是“是”。所以首先锁定 Lombok。
  3. 检查 JDK 和 Lombok 版本兼容性 -> 这几乎是唯一的解决方案。

其他一些工具(如 MapStruct、某些代码生成插件)也可能依赖编译器内部 API,但它们出现的频率远低于 Lombok。因此,在遇到这个错误时,Lombok 版本不兼容是首要怀疑对象

总结一下,判断基于:

  1. 错误类型NoSuchFieldError 指向运行时二进制兼容性问题。
  2. 错误位置: 发生在 com.sun.tools.javac 这个编译器的内部包中。
  3. 常识: 只有注解处理器会深入操作这些内部 API,而 Lombok 是其中最普遍的一个。
  4. 经验: 这是一个社区里非常常见的问题,有固定的解决模式。

2-项目从模块代码爆红-250915

【描述】

我已经在项目主模块pom文件配置了正确的lombok,也编译通过了,但是其他模块的文件中依然有报错。

1
无法解析符号 'lombok'

【分析】

我主模块编译通过,但文件中依旧报错,我将三个从模块重新导入到IDEA文件就不报错了。我最开始只是导入的主模块的pom文件,这是不对的。

正确的操作流程(以后都这样操作):

  1. 关闭当前项目
    • 菜单栏选择 File -> Close Project,回到 IDEA 的欢迎界面。
  2. 从根目录打开项目
    • 在欢迎界面,选择 Open(而不是 Open or Import 后单独选某个子模块的 pom.xml)。
    • 浏览并选择包含所有模块的那个顶层目录(这个目录下有总的 pom.xml 以及 sky-common, sky-pojo, sky-server 等子目录)。
    • 点击 OK
  3. 让 IDEA 自动处理
    • IDEA 会识别出这是一个 Maven 多模块项目。
    • 它会读取根 pom.xml 中的 <modules> 配置,然后自动将所有这些子模块导入到当前 IDEA Project 中。
    • 您会在左侧的 Project 工具窗口中看到完整的模块树状结构。
  4. 确认导入成功
    • 导入完成后,检查右侧的 Maven 工具窗口。您应该能看到一个聚合的视图,列出了所有模块以及它们的生命周期和依赖关系。这才是正确的状态。

为什么最初的方法会出问题?

我最开始只导入了主模块(比如 sky-server)的 pom.xml。这意味着我告诉 IDEA:“请创建一个项目,这个项目只基于 sky-server/pom.xml”。

当 IDEA 为此项目构建索引和类路径时,它看到 pom.xml 里声明了依赖 sky-commonsky-pojo。它就会去本地 Maven 仓库~/.m2/repository)里查找这些依赖。虽然我之前用命令行 mvn install 编译过,依赖包确实存在于本地仓库,但 IDEA 可能没有自动将它们作为“模块”关联到当前项目中,导致源代码级别的引用(如 import com.sky.*)无法正确解析,从而出现红色报错。

【结论】

解决方法:按照标准的方法打开项目,而不是只导入个主模块的pom。

3-编译单个模块时报错-250915

【描述】

报错信息为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.sky:sky-server >-------------------------
[INFO] Building sky-server 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The POM for com.sky:sky-common:jar:1.0-SNAPSHOT is missing, no dependency information available
[WARNING] The POM for com.sky:sky-pojo:jar:1.0-SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.908 s
[INFO] Finished at: 2025-09-15T17:31:15+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project sky-server: Could not resolve dependencies for project com.sky:sky-server:jar:1.0-SNAPSHOT
[ERROR] dependency: com.sky:sky-common:jar:1.0-SNAPSHOT (compile)
[ERROR] Could not find artifact com.sky:sky-common:jar:1.0-SNAPSHOT
[ERROR] dependency: com.sky:sky-pojo:jar:1.0-SNAPSHOT (compile)
[ERROR] Could not find artifact com.sky:sky-pojo:jar:1.0-SNAPSHOT
[ERROR]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException

【结论】

正常。这个错误表明 Maven 在多模块项目中无法解析模块间的依赖关系。具体来说,sky-server 模块依赖于 sky-commonsky-pojo 模块,但 Maven 找不到这些依赖的 JAR 包。

解决方法就是编译主模块。

4-登录功能测试时报错-250915

【描述】

报错内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
2025-09-15 17:46:37.851 ERROR 8016 --- [eate-1890881203] com.alibaba.druid.pool.DruidDataSource   : create connection SQLException, url: jdbc:mysql://localhost:3306/sky_take_out?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true, errorCode 1045, state 28000

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.30.jar:8.0.30]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.30.jar:8.0.30]
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-java-8.0.30.jar:8.0.30]
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-java-8.0.30.jar:8.0.30]
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-java-8.0.30.jar:8.0.30]
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.30.jar:8.0.30]
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1651) ~[druid-1.2.1.jar:1.2.1]
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1717) ~[druid-1.2.1.jar:1.2.1]
at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2785) ~[druid-1.2.1.jar:1.2.1]

【分析】

这个错误表明我的应用程序无法连接到 MySQL 数据库,原因是访问被拒绝。

1
Access denied for user 'root'@'localhost' (using password: YES)

这意味着使用 ‘root’ 用户和提供的密码尝试从本地主机连接到 MySQL 时被拒绝了。

【结论】

忘记在yml文件配置数据库密码了。

1
2
3
4
5
6
7
8
sky:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
host: localhost
port: 3306
database: sky_take_out
username: root
password: