jpackage 报错 FileSystemException: File name too long 的根本原因是将 -i(输入目录)与 -d(输出目录)指定为同一路径,引发递归嵌套复制,最终生成超长路径。解决方法是严格分离输入与输出目录。
jpackage 报错 `filesystemexception: file name too long` 的根本原因是将 `-i`(输入目录)与 `-d`(输出目录)指定为同一路径,引发递归嵌套复制,最终生成超长路径。解决方法是严格分离输入与输出目录。
该错误并非 JDK 版本兼容性问题(尽管你从 JDK 11 升级到 JDK 17),而是 jpackage 工具在路径处理逻辑上的行为变化所致。当使用相同目录作为输入(-i ../Released)和输出(-d ../Released)时,jpackage 会尝试将生成的 .app 包(如 Boekhouding.app)写入目标目录,而该目录本身又作为输入被再次扫描——导致 Boekhouding.app/Contents/app/Boekhouding.app/Contents/app/... 层层嵌套,路径指数级增长,最终触发 macOS 文件系统对路径长度的限制(通常 ≤ 1024 字节)。
✅ 正确做法是严格区分输入与输出路径:
# ✅ 推荐:输入指向资源目录,输出指向独立构建目录
jpackage \
--type app-image \
-i ../Released \ # 仅含 run.jar、依赖等静态资源
-d ../Build/dist \ # 全新、空的输出目录(自动创建)
-n "Boekhouding" \
--app-version "1.3.7" \
--icon ../../Images/euro.icns \
--main-jar run.jar \
--verbose
⚠️ 注意事项:
- 禁止复用目录:-i 和 -d 绝对不可指向同一路径或其子/父目录(如 ../Released 与 ../Released/dist 仍存在风险);
- 输出目录需为空或不存在:jpackage 不会自动清理 -d 目录,残留文件可能干扰构建;
- 建议集成到构建流程:在 Maven/Gradle 或 shell 脚本中,先执行 rm -rf ../Build/dist 再调用 jpackage,确保干净构建;
- 验证路径合法性:macOS 对 .app 包内路径深度敏感,避免在 --input 中包含已存在的 .app 结构。
? 扩展提示:若项目需自动化打包,可定义清晰的目录结构:
project/ ├── src/ ├── Released/ # ✅ 输入:jar、libs、resources ├── Build/ │ └── dist/ # ✅ 输出:每次 clean 后全新生成 └── package.sh # 脚本中明确分离 -i 和 -d
遵循“输入只读、输出独占”原则,即可彻底规避此类 FileSystemException,并提升构建可重复性与可靠性。











