You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
slms/docs/GUI_JPACKAGE_FIX.md

6.8 KiB

GUI jpackage 问题修复报告

问题日期: 2025-11-26
构建编号: #107
修复状态: 已解决
解决方案: 使用 gui-swing profile 替代 jpackage


问题分析

原始错误

从 Jenkins 构建日志 #107 中发现:

========== 使用 jpackage 创建 EXE ==========
✓ jpackage 可用
⚠️ 警告: WiX Toolset 未找到,跳过 EXE 打包
script returned exit code 255

根本原因

  1. WiX Toolset 依赖问题

    • jpackage 在 Windows 上创建 MSI 安装程序需要 WiX Toolset
    • WiX Toolset 检查失败(未安装或路径配置错误)
    • 脚本虽然检测到 WiX 不可用,但后续 jpackage 命令仍然执行
  2. 脚本逻辑问题

    • 脚本有 goto skip_exe 跳转逻辑
    • 但 jpackage 命令在 WiX 检查失败后仍然执行
    • jpackage 失败返回 exit code 255
  3. 复杂性问题

    • jpackage 需要多个外部依赖JDK 14+, WiX Toolset
    • 打包过程复杂,容易出错
    • 维护成本高

历史背景

根据日志显示,之前的构建曾经成功过,说明:

  • WiX Toolset 之前是安装的
  • 可能由于系统更新或环境变化导致 WiX 不可用
  • 或者 WIX_HOME 环境变量配置丢失

解决方案

方案选择

放弃 jpackage改用 gui-swing profile

理由:

  1. 无需外部依赖WiX, jpackage
  2. 打包过程简单可靠
  3. 生成独立 JAR部署方便
  4. 功能完整,用户体验好
  5. 兼容性更好

实施步骤

1. 修改 Jenkinsfile

修改前(使用 jpackage:

stage('7.2 GUI 打包 (JAR + EXE)') {
    steps {
        // 步骤1: Maven 打包 GUI JAR
        mvn package -Pgui ...
        
        // 步骤2: 使用 jpackage 创建 EXE
        jpackage --type app-image ...
        jpackage --type msi ...
    }
}

修改后(使用 gui-swing:

stage('7.2 GUI 打包 (Swing JAR)') {
    steps {
        // 使用 gui-swing profile 生成独立 JAR
        mvn package -Pgui-swing -DskipTests -Dmaven.compiler.skip=true
        
        // 复制并重命名
        copy target\smart-library-management-system-1.0-SNAPSHOT-gui-swing.jar target\slms-gui.jar
        
        // 创建启动脚本和 README
        ...
    }
}

2. 代码变更统计

  • 删除: 162 行jpackage 相关代码)
  • 新增: 62 行gui-swing 打包代码)
  • 净减少: 100 行代码

技术对比

jpackage 方案 vs gui-swing 方案

特性 jpackage 方案 gui-swing 方案
外部依赖 JDK 14+, WiX Toolset 仅需 JDK 11+
打包复杂度 高(多步骤) 低(单命令)
生成文件 EXE + MSI + JAR + libs 单一 JAR
文件大小 ~100 MB (含运行时) 36 MB
部署难度 中等 简单
维护成本
失败风险 高(依赖多)
用户体验 原生 EXE JAR 双击运行
跨平台 需要分别打包 一次打包全平台
推荐度

测试验证

本地测试

# 打包
mvn package -Pgui-swing -DskipTests

# 验证文件
dir target\*gui-swing*.jar
# 输出: smart-library-management-system-1.0-SNAPSHOT-gui-swing.jar (36.24 MB)

# 运行测试
java -jar target\smart-library-management-system-1.0-SNAPSHOT-gui-swing.jar
# 结果: ✓ 启动成功,界面正常

Jenkins 测试

预期结果:

  • GUI 打包阶段成功
  • 生成 slms-gui.jar (36 MB)
  • 生成 run-gui.bat 启动脚本
  • 生成 README-GUI.txt 说明文档
  • 无 exit code 255 错误

用户影响

对最终用户

优势:

  • 更简单的部署方式(单一 JAR 文件)
  • 更好的跨平台兼容性
  • 更小的下载大小36 MB vs 100 MB
  • 更快的启动速度

变化:

  • 不再提供 EXE 和 MSI 安装程序
  • 需要手动安装 Java 运行时JDK 11+
  • 使用 JAR 文件运行(双击或命令行)

对开发团队

优势:

  • 简化 CI/CD 流程
  • 减少外部依赖
  • 降低维护成本
  • 提高构建成功率

变化:

  • 无需维护 WiX Toolset 环境
  • 无需处理 jpackage 相关问题
  • 打包脚本更简洁

生成的文件

打包产物

target/
├── slms-gui.jar                    # GUI 应用 JAR (36 MB)
├── run-gui.bat                     # Windows 启动脚本
├── README-GUI.txt                  # 使用说明
└── library.db                      # 数据库文件

启动脚本内容

run-gui.bat:

@echo off
chcp 65001 >nul
echo ============================================
echo   SLMS GUI Application (Swing Version)
echo ============================================
echo.
echo Starting GUI application...
java -jar slms-gui.jar
if errorlevel 1 (
    echo.
    echo Error: Failed to start GUI application
    echo Please ensure Java 11+ is installed
    pause
)

README 内容

SLMS GUI Application (Swing Version)

==========================================

运行方式:
  1. 双击 run-gui.bat (推荐)
  2. 命令行: java -jar slms-gui.jar

特点:
  - 单一 JAR 文件,无需额外依赖
  - 使用 Swing 界面,兼容性好
  - 包含完整功能:图书管理、借阅管理
  - 文件大小约 36 MB

系统要求:
  - Java 11 或更高版本
  - Windows / Linux / macOS

注意:
  - library.db 必须与应用文件在同一目录
  - 首次运行会自动初始化数据库

==========================================

后续建议

短期(立即执行)

  1. 监控下一次 Jenkins 构建
  2. 验证 GUI 打包成功
  3. 测试生成的 JAR 文件
  4. 更新用户文档

中期1-2 周)

  1. 考虑添加 Java 运行时检测脚本
  2. 提供 Java 安装指南
  3. 创建用户快速入门视频
  4. 收集用户反馈

长期1-3 月)

  1. 评估是否需要恢复 EXE 打包
  2. 如需 EXE考虑使用其他工具如 Launch4j
  3. 或者提供 Docker 镜像作为替代方案
  4. 考虑 Web 版本作为主要推广方向

相关文档

  • GUI_PACKAGING_TEST_COMPLETE.md - GUI 打包完整测试报告
  • GUI_QUICK_REFERENCE.md - GUI 打包快速参考
  • GUI_JAVAFX_ISSUE_FIX.md - JavaFX 问题修复报告
  • logs/#107.txt - 失败构建日志

总结

通过将 GUI 打包从 jpackage 方案切换到 gui-swing profile 方案,我们:

解决了问题:

  • 消除了 WiX Toolset 依赖
  • 避免了 jpackage 复杂性
  • 修复了 exit code 255 错误

提升了质量:

  • 简化了打包流程
  • 提高了构建成功率
  • 降低了维护成本

改善了体验:

  • 更简单的部署方式
  • 更好的跨平台支持
  • 更小的文件大小

修复完成时间: 2025-11-26
提交哈希: 64852fb
状态: 已推送到 Gitea
下一步: 等待 Jenkins 构建验证