You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Launch4J打包的Java可执行文件经signtool签名后无法运行

Launch4J打包EXE签名后提示JAR损坏的原因说明

问题复现

使用Launch4J将Java应用、内置JRE和Uber Jar打包为可执行文件后,未签名的exe可正常运行,使用以下命令签名后程序报错:

signtool sign /td sha1 /fd sha1 /f my_certificate.pfx /p mypass myexecutable.exe

报错信息为:

Java Virtual Machine Launcher Error: Invalid or corrupt jarfile

根本原因

Launch4J的运行逻辑是在exe stub(启动器)后追加内置JAR、JRE资源,同时在PE头的自定义字段中记录这些资源的起始偏移量,启动时根据偏移量直接读取对应位置的资源加载运行。
代码签名操作会修改PE文件的固有结构,导致原有偏移量失效,启动器读取到的JAR内容错乱,因此抛出损坏错误:

  • 签名工具会向PE文件的证书目录段写入签名数据,增加了PE头的总长度,改变了后续追加资源的起始位置
  • 低版本Launch4J的偏移量计算逻辑没有考虑PE证书段的存在,无法自动适配签名后的文件结构
  • 若打包时开启了Launch4J的EXE压缩选项,UPX压缩后的PE结构对偏移变更更敏感,会进一步放大该问题

修复方案

  • 升级Launch4J到3.14及以上版本,该版本开始优化了内置资源的定位逻辑,会自动跳过PE签名段计算资源偏移,原生支持签名后的PE结构
  • 打包时关闭Launch4J的「压缩EXE」选项,避免UPX压缩和签名操作的叠加冲突
  • 不需要修改现有签名命令,当前使用的SHA1签名参数本身不会触发问题,无需更换哈希算法
  • 如果必须使用低版本Launch4J,可调整打包逻辑不将JAR嵌入EXE内部,改为exe和同目录的JAR、JRE分发,仅对exe启动器进行签名即可

内容的提问来源于stack exchange,提问作者anas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:15:06