PAYATHON 2026

Windows 11 运行 Maven 构建的 .exe 时提示无法运行

排障赵师傅

结论

Maven 不会自动把 Angular 或普通 Java Web 项目编译成可直接双击运行的 Windows .exe。target 目录里的 .exe 可能是构建插件下载的 Node.js、Yarn 等辅助程序,也可能是打包插件生成的启动器,未必是 ThingsBoard 应用的入口。

如果 Windows 尚未开始加载文件就提示 “This app can’t run on your PC”,问题通常出在文件格式、CPU 架构或文件内容上。修改管理员权限或 PATH 配置一般无法解决。

先确认该文件是什么

不能只看 .exe 后缀判断文件用途。先检查它的完整路径、大小和生成时间:

Get-Item .\target\xxx.exe |
    Select-Object FullName, Length, CreationTime, LastWriteTime

接着查看文件开头。有效的 Windows PE 可执行文件通常以 MZ 开头:

Format-Hex .\target\xxx.exe | Select-Object -First 2

如果开头不是 4D 5A,该文件很可能不是有效的 Windows 可执行文件。可能的原因有:

  • 下载失败,HTML 错误页面被保存成了 .exe;
  • 代理服务器返回了认证页面或拦截页面;
  • 文件没有下载完整;
  • Linux 或 macOS 可执行文件被误命名为 .exe;
  • 构建脚本生成了占位文件或中间产物。

还可以在 Visual Studio Developer Command Prompt 中使用 dumpbin 查看 PE 信息:

dumpbin /headers target\xxx.exe

如果 dumpbin 报告文件格式无效,需要检查生成或下载该文件的构建步骤。

检查 CPU 架构是否匹配

查看 Windows 和处理器架构:

Get-CimInstance Win32_OperatingSystem |
    Select-Object OSArchitecture

$env:PROCESSOR_ARCHITECTURE

再查看 .exe 的目标架构:

dumpbin /headers target\xxx.exe | findstr /i "machine"

常见标识如下:

  • x64 或 8664:AMD64/x86-64;
  • x86 或 14C:32 位 x86;
  • ARM64 或 AA64:ARM64。

在 ARM64 Windows 上构建时,插件可能下载了架构错误的二进制包。启动器如果由 Launch4j、jpackage 或类似工具生成,还要检查打包配置中的目标架构。Windows 11 通常是 64 位系统,具体仍以实际检查结果为准。

从 Maven 日志确定 .exe 的来源

重新构建时开启详细日志,并将日志保存下来:

mvn -X clean package > build.log 2>&1

在日志中搜索文件名:

findstr /i /n "xxx.exe" build.log

也可以搜索可能下载或生成可执行文件的插件:

findstr /i /n "frontend node yarn npm launch4j jpackage download" build.log

重点确认两件事:

  1. 哪个 Maven 插件创建或下载了该文件?
  2. 日志是否将它声明为应用启动入口?

如果日志表明该文件属于 frontend-maven-plugin、Node.js 或 Yarn,它通常只是前端构建工具,不应在构建完成后作为 ThingsBoard 服务运行。

使用项目规定的启动方式

ThingsBoard 包含 Java 后端和 Web 前端。Angular 通常生成 JavaScript、CSS 和静态资源,不会生成独立的 Windows 桌面程序。Java 后端一般通过 Maven、Spring Boot、可执行 JAR、安装包或项目提供的启动脚本运行。

先查看当前 ThingsBoard 版本对应的项目文档、根目录 README、pom.xml 和构建日志。Java 项目常见的启动命令包括:

mvn spring-boot:run

也可以运行 Maven 生成的 JAR:

java -jar target\application.jar

具体使用哪条命令,要以项目的实际模块和配置为准。如果项目采用多模块结构,可运行的 JAR 可能在某个子模块的 target 目录中,而不在仓库根目录。

可以先列出生成的 JAR:

Get-ChildItem -Recurse -Filter *.jar |
    Select-Object FullName, Length

不要随意执行 target 中的每一个 .exe,这些文件可能是构建工具、安装器组件或测试辅助程序。

清理损坏的下载和构建缓存

确认 .exe 是插件所需的 Windows 工具,并且文件格式无效后,可以删除该插件对应的缓存并重新下载。先执行普通清理:

mvn clean

前端依赖可以根据项目使用的包管理器重新安装。使用 npm 的项目可执行:

npm cache verify
npm install

如果项目使用 Yarn,应使用项目锁定的 Yarn 版本和对应命令。不要混用 npm 与 Yarn,以免重新生成锁文件。

Maven 插件下载的二进制文件可能位于以下位置:

  • 项目目录中的 node、node_modules、.cache 或构建目录;
  • Maven 本地仓库 %USERPROFILE%\.m2\repository;
  • 插件通过 installDirectory 等参数指定的位置。

只删除已经确认属于该插件的缓存目录,不要直接清空整个 .m2 仓库。重新构建时,留意日志中是否出现 HTTP 错误、代理认证失败、TLS 错误或校验失败。

检查代理、防病毒软件和文件来源

企业代理或安全网关可能会把二进制下载请求替换成 HTML 页面。可以计算文件哈希,再与发布方提供的校验值比较:

Get-FileHash .\target\xxx.exe -Algorithm SHA256

只有发布方提供了对应版本和平台的官方 SHA-256 值时,这种比较才有意义。没有官方校验值,单凭哈希无法判断文件是否正确。

还可以检查文件是否带有互联网来源标记:

Get-Item .\target\xxx.exe -Stream *

如果文件来源可信,只是被 Windows 标记为来自互联网,可以解除标记:

Unblock-File .\target\xxx.exe

Unblock-File 不能修复损坏的文件,也不能解决架构不匹配的问题。不要为了绕过检查而关闭 Microsoft Defender,也不要对来源不明的 .exe 解除阻止。

Java 和 Node.js 版本是否相关

Java 11 或 Node.js 20 是否受当前 ThingsBoard 版本支持,需要结合该版本的构建配置和官方要求确认。版本不兼容可能导致 Maven、npm 或应用启动失败,但通常会出现 Java 异常、npm 错误或构建失败信息。Windows 在加载 .exe 时直接提示无法运行,一般不是由这类版本问题引起的。

建议按以下顺序排查:

  1. 确认 .exe 是否为应用入口;
  2. 验证文件是否为完整、有效的 Windows PE 文件;
  3. 检查目标 CPU 架构;
  4. 从 Maven 日志中找到生成或下载该文件的插件;
  5. 按项目规定运行 JAR、服务脚本或安装包;
  6. 再检查 Java、Node.js 与项目版本的兼容性。

备注:内容仅供参考。