本文记录了我在使用 IntelliJ IDEA(2025.1.1.1 Ultimate)运行 Spark 项目时遇到的一系列问题,尤其是涉及 Kryo 序列化失败、Java 模块访问受限等问题,并详细总结了解决方法,供大数据初学者参考。
🧩 项目背景
- 开发语言:Scala 2.13
- 项目管理工具:Maven
- 大数据组件:Spark 4.0.0
- 开发环境:Arch Linux + IntelliJ IDEA 2025.1.1.1
- JDK 版本:Java 17
🚧 遇到的主要问题与错误
在使用 exec-maven-plugin 或 IntelliJ IDEA 点击运行时,出现如下典型报错:
❌ Kryo 报错
Exception in thread “main” java.lang.IllegalArgumentException: Unable to create serializer “***.esotericsoftware.kryo.serializers.FieldSerializer” for class: java.nio.HeapByteBuffer
…
module java.base does not “opens java.nio” to unnamed module
### ❌ VM 启动失败
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has o***urred. Program will exit.
### ❌ 类找不到
java.lang.ClassNotFoundException: org.example.xt1
---
## 🛠️ 问题分析与解决方案
### ✅ 1. Maven 插件配置错误导致无法传入 JVM 参数
#### 报错示例:
[ERROR] Parameter ‘jvmArgs’ is unknown for plugin ‘exec-maven-plugin’
#### 正确配置方法:
```xml
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<mainClass>org.example.YourMainClass</mainClass>
<arguments>
<argument>--add-opens=java.base/java.nio=ALL-UNNAMED</argument>
<argument>--add-opens=java.base/java.util=ALL-UNNAMED</argument>
<argument>--add-opens=java.base/java.lang.invoke=ALL-UNNAMED</argument>
</arguments>
</configuration>
</plugin>
✅ 2. IntelliJ IDEA 运行时无法设置 VM options
默认状态:
Run → Edit Configurations 中不显示 VM options。
解决步骤:
- 点击右侧窗口上方的 “🛠 Modify options”
- 选择
Add VM options - 在新出现的输入框中添加如下参数:
--add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED
- 点击 OK / Apply 保存。
✅ 3. Scala 源码路径未配置正确
确保 Scala 源码在以下目录:
src/main/scala/org/example/YourMainClass.scala
如果没有
scala文件夹,可手动创建,并标记为Sources Root。
✅ 最终效果
添加 VM 参数并调整代码路径后,无论是:
mvn exec:java
还是点击 IntelliJ 的绿色运行按钮,程序均能正常启动。
🧠 总结
本次遇到的问题本质上源于:
- Java 17 模块限制了反射访问(Kryo 无法访问
java.nio.Buffer) - Maven 插件配置不当
- IntelliJ 默认隐藏 VM 配置项
- Scala 文件路径未设置为源码路径
解决关键在于 添加 VM 启动参数:
--add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED
💬 结语
如果你也在用 IntelliJ 开发 Spark(Scala)项目,遇到类似错误,希望这篇笔记能帮你节省排查时间。
如有疑问或建议,欢迎评论交流!一起成为更强的大数据工程师 🚀