【持续更新】踩坑记录

【持续更新】踩坑记录
M-YoungBWeN【持续更新】踩坑记录
1-项目主模块编译报错-250915
【描述】
使用Maven编译项目主模块时出现错误。Maven->项目主模块->生存期->compile
1 | [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] |
【分析】
NoSuchFieldError
和 JCTree$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 是迄今为止最流行、最常遇到此问题的库。其诊断过程可以概括为:
- 看到涉及
javac
内部 API 的NoSuchFieldError
/NoSuchMethodError
-> 立即怀疑是注解处理器。 - 项目是否使用了 Lombok? -> 绝大多数情况下答案是“是”。所以首先锁定 Lombok。
- 检查 JDK 和 Lombok 版本兼容性 -> 这几乎是唯一的解决方案。
其他一些工具(如 MapStruct、某些代码生成插件)也可能依赖编译器内部 API,但它们出现的频率远低于 Lombok。因此,在遇到这个错误时,Lombok 版本不兼容是首要怀疑对象。
总结一下,判断基于:
- 错误类型:
NoSuchFieldError
指向运行时二进制兼容性问题。 - 错误位置: 发生在
com.sun.tools.javac
这个编译器的内部包中。 - 常识: 只有注解处理器会深入操作这些内部 API,而 Lombok 是其中最普遍的一个。
- 经验: 这是一个社区里非常常见的问题,有固定的解决模式。
2-项目从模块代码爆红-250915
【描述】
我已经在项目主模块pom文件配置了正确的lombok,也编译通过了,但是其他模块的文件中依然有报错。
1 | 无法解析符号 'lombok' |
【分析】
我主模块编译通过,但文件中依旧报错,我将三个从模块重新导入到IDEA文件就不报错了。我最开始只是导入的主模块的pom文件,这是不对的。
正确的操作流程(以后都这样操作):
- 关闭当前项目:
- 菜单栏选择
File -> Close Project
,回到 IDEA 的欢迎界面。
- 菜单栏选择
- 从根目录打开项目:
- 在欢迎界面,选择
Open
(而不是Open or Import
后单独选某个子模块的pom.xml
)。 - 浏览并选择包含所有模块的那个顶层目录(这个目录下有总的
pom.xml
以及sky-common
,sky-pojo
,sky-server
等子目录)。 - 点击
OK
。
- 在欢迎界面,选择
- 让 IDEA 自动处理:
- IDEA 会识别出这是一个 Maven 多模块项目。
- 它会读取根
pom.xml
中的<modules>
配置,然后自动将所有这些子模块导入到当前 IDEA Project 中。 - 您会在左侧的 Project 工具窗口中看到完整的模块树状结构。
- 确认导入成功:
- 导入完成后,检查右侧的 Maven 工具窗口。您应该能看到一个聚合的视图,列出了所有模块以及它们的生命周期和依赖关系。这才是正确的状态。
为什么最初的方法会出问题?
我最开始只导入了主模块(比如 sky-server
)的 pom.xml
。这意味着我告诉 IDEA:“请创建一个项目,这个项目只基于 sky-server/pom.xml
”。
当 IDEA 为此项目构建索引和类路径时,它看到 pom.xml
里声明了依赖 sky-common
和 sky-pojo
。它就会去本地 Maven 仓库(~/.m2/repository
)里查找这些依赖。虽然我之前用命令行 mvn install
编译过,依赖包确实存在于本地仓库,但 IDEA 可能没有自动将它们作为“模块”关联到当前项目中,导致源代码级别的引用(如 import com.sky.*
)无法正确解析,从而出现红色报错。
【结论】
解决方法:按照标准的方法打开项目,而不是只导入个主模块的pom。
3-编译单个模块时报错-250915
【描述】
报错信息为:
1 | [INFO] Scanning for projects... |
【结论】
正常。这个错误表明 Maven 在多模块项目中无法解析模块间的依赖关系。具体来说,sky-server
模块依赖于 sky-common
和 sky-pojo
模块,但 Maven 找不到这些依赖的 JAR 包。
解决方法就是编译主模块。
4-登录功能测试时报错-250915
【描述】
报错内容:
1 | 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 |
【分析】
这个错误表明我的应用程序无法连接到 MySQL 数据库,原因是访问被拒绝。
1 | Access denied for user 'root'@'localhost' (using password: YES) |
这意味着使用 ‘root’ 用户和提供的密码尝试从本地主机连接到 MySQL 时被拒绝了。
【结论】
忘记在yml文件配置数据库密码了。
1 | sky: |